Tại sao không nên dùng printStackTrace()? | Why is printStackTrace() not recommended?

Trong khi lập trình trên Java thì các bạn không lạ gì hàm in ngoại lệ phát sinh ra màn hình "printStackTrace()", có thể nói đây là một hàm rất thông dụng. Tuy nhiên trên giao diện lập trình ừng dụng Netbeans thì lại đưa ra lời khuyên không nên dùng "Throwable.printStackTrace() should be removed". Vì sao lại không nên dùng.

Description - Mô tả.

Trong các giao diện lập trình khác như Eclipse, Jcreator thì không có bất kỳ cảnh báo nào, duy nhất chỉ có Netbeans là ta sẽ nhân được thông "Throwable.printStackTrace() should be removed".



Sau khi tham khảo các ý trên mạng thì ý kiến được mọi người đồng tình nhiều nhất là Netbeans hay nói chính xác là Java cho rằng hàm thông báo này là rất đơn giải, nội dung trong thông quá chung chung không đáp ứng được yêu cầu của nhà phát kiểm hay của tester kiểm lỗi, hay phục vụ cho quá trình check bug, vì vậy nó cảnh báo nên sử dụng một biện pháp khác.

Tuy nhiên có thể bạn vẫn muốn dùng hàm này, hoặc muốn một hàm nào đó thay thế tốt hơn, hãy xem xét một số giải pháp bên dưới có thể giúp ích cho bạn.


Solution - Giải pháp.

1. System.out:
e.printStackTrace(System.out);

Giải pháp đơn giản nhất, vẫn sử dụng "printStackTrace", vã không nhận được cảnh báo mà vàng từ Netbeans là bạ thêm tham số System.out vào "printStackTrace".

2. Logger:
Logger.getAnonymousLogger().log(Level.SEVERE, "msg", e);

Sử dụng "Logger" thay cho "printStackTrace" sẽ có kết quả tương tự, nhưng sẽ không nhận được cảnh báo từ Netbeans.

3. System.println & Exception:
      System.err.println("1");
      System.err.println(e);
      System.err.println("\n2");
      System.err.println(e.getMessage());
      System.err.println("\n3");
      System.err.println(e.getLocalizedMessage());
      System.err.println("\n4");
      System.err.println(e.getCause());
      System.err.println("\n5");
      System.err.println(Arrays.toString(e.getStackTrace()));
      System.err.println("\n6");

Sử dựng Syste.println để in các thông tin báo lỗi như "getMessage", "getCause",... ra ngoài màn hình, kết quả cho ra cũng không khác lắm so với "printStackTrace".


Example - Ví dụ:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package z_test;

/**
 *
 * @author BUI NGOC SON
 * @website vnlives.net
 * @create: 21-11-2014
 */
import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ExceptionTest {

    public ExceptionTest() {
        Properties props = new Properties();
        try {
            props.load(new FileInputStream(new File("foo")));
        } catch (Exception e) {

//            System.out.println("----- printStackTrace()");
//            e.printStackTrace(); 
           
            System.out.println("----- 1. System.out:");
            e.printStackTrace(System.out);                     
//           
//            System.out.println("----- 2. Logger:");           
//            Logger.getAnonymousLogger().log(Level.SEVERE, "msg", e); 
//            Logger.getLogger(ExceptionTest.class.getName()).log(Level.SEVERE, null, e);           
//           
//            System.err.println("----- 3. System.println & Exception:");
//            System.err.print("1: ");
//            System.err.println(e);
//            System.err.print("2: ");
//            System.err.println(e.getMessage());
//            System.err.print("3: ");
//            System.err.println(e.getLocalizedMessage());
//            System.err.print("4: ");
//            System.err.println(e.getCause());
//            System.err.print("5: ");
//            System.err.println(Arrays.toString(e.getStackTrace()));





        }
    }

    public static void main(String[] args) {
        new ExceptionTest();
    }
}


Result - Kết quả:




 Write: +Bui Ngoc Son




No comments:

Post a Comment