2015-09-29 35 views
10

Có cách nào tốt nhất để sử dụng hai phần mã sau đây liên quan đến ngoại lệ.In ngoại lệ và ngoại lệ Exception.getMessage

//code1 

} catch (SomeException e) { 
    logger.error("Noinstance available!", e.getMessage()); 
} 

//code2 
} catch (SomeException e) { 
    logger.error("Noinstance available!", e); 
} 

Khi nào tôi nên sử dụng phương pháp getMessage của ngoại lệ?

+1

Hầu như mọi lúc. Trừ khi bạn biết SomeException và phương thức toString overriden. E.getMessage() là cách tiêu chuẩn –

+2

Nếu bạn chỉ đăng nhập thư, bạn không nhận được dấu vết ngăn xếp hoặc ngoại lệ lồng nhau sẽ có một. Ghi lại ngoại lệ ... –

+2

@TheNeoNoirDeveloper: "Hầu hết mọi lúc" cái gì? Cái đầu tiên? Tôi không muốn để mất thông tin về nơi mà các ngoại lệ đến từ, nguyên nhân của nó vv –

Trả lời

10

Đầu tiên không biên dịch vì phương pháp error chấp nhận tham số String làm tham số đầu tiên và tham số thứ nhất là Throwable.

e.getMessage() không phải là Throwable.

Mã nên được

} catch (SomeException e) { 
    // No stack trace 
    logger.error("Noinstance available! " + e.getMessage()); 
} 

So với

} catch (SomeException e) { 
    // Prints message and stack trace 
    logger.error("Noinstance available!", e); 
} 

Các bản in đầu tiên chỉ là một tin nhắn. Các bản in thứ hai cũng theo dõi toàn bộ stack.

Nó phụ thuộc vào ngữ cảnh nếu cần in dấu vết ngăn xếp hay không.

Nếu bạn đã biết tại sao ngoại lệ có thể bị ném thì không nên in toàn bộ theo dõi ngăn xếp.

Nếu bạn không biết, tốt hơn là in toàn bộ dấu vết để tìm lỗi dễ dàng.

+0

Tôi đang sử dụng trình ghi sl4j và biên dịch mã1 của tôi. tại sao là – DesirePRG

+0

Ok, thông tin của tôi là dành cho log4j tiêu chuẩn, nhưng phần còn lại vẫn hợp lệ –

0

Exception.printStackTrace() không nên được sử dụng trừ khi bạn đang gỡ lỗi ví dụ.

Để đăng nhập, tốt hơn hết là sử dụng Exception.getMessage(). Cũng xin lưu ý rằng nhiều khung khai thác gỗ (ví dụ Log4j) chấp nhận ngoại lệ nó là một đối số trên phương thức ghi nhật ký (ví dụ: error()) và tự làm việc đó.

1

Nó phụ thuộc nếu bạn cần theo dõi ngăn xếp của ngoại lệ ban đầu (SomeException). Nếu có, thì code2 là tùy chọn đúng ở đây. Lưu ý rằng cách phổ biến hơn là xử lý các tình huống này.

Nếu bạn không quan tâm đến ngoại lệ ban đầu, bạn có thể sử dụng mã1 nhưng điều này không chính xác. Bởi vì mã bạn đã gửi nhận thông báo là đối số. Vì vậy, một cách chính xác là:

logger.error("Noinstance available! - reason:" + e.getMessage()); 
2

nguyên mẫu này rất hữu ích, khi bạn phân loại ngoại lệ vào Business mứcngoại lệ kỹ thuật.

Đối với ngoại lệ cấp doanh nghiệp, bạn chỉ cần sử dụng tin nhắn, bằng cách đăng nhập analytics hoặc có thể hiển thị trên màn hình thông tin ý nghĩa (không hoạt động).

Đối với ngoại lệ kỹ thuật, tốt hơn là ghi nhật ký lỗi với stacktrace, để tìm ra vấn đề và dễ dàng gỡ lỗi và giải quyết.

1

Với stacktrace:

logger.error("Could not do XYZ because of: " + ex, ex); 

Without stacktrace:

logger.error("Could not do XYZ because of: " + ex); 
0

Bạn có thể thử điều này: -

logger.error(e.getMessage(), e); 

Nó Trả về chuỗi nhắn chi tiết của Throwable này.

logger.error(e.getLocalizedMessage(),e); 

Tạo mô tả đã được bản địa hoá của thao tác này. Các lớp con có thể ghi đè phương thức này để tạo ra một thông điệp địa phương cụ thể. Đối với các lớp con không ghi đè phương thức này, thực thi mặc định trả về kết quả tương tự như getMessage().

Trong trường hợp của bạn e là gì, nhưng đối tượng của ngoại lệ ...

getLocalizedMessage() u cần phải ghi đè và đưa ra thông điệp của riêng bạn tức là ý nghĩa cho thông điệp cục bộ.

Các vấn đề liên quan