2012-08-07 49 views
6

Hey Cộng đồng StackOverflow,Ném và bắt ngoại lệ

Về ném ngoại lệ. Nói chung, khi nào tôi ném và ngoại lệ, và khi nào tôi bắt nó?

Hãy nói rằng tôi tình cờ gặp phải những tình huống này mà tôi phải từ bỏ vì một số vấn đề đã xảy ra và tôi không thể phục hồi nó. Tôi có ném hay bắt được không?

tôi làm điều này ngay bây giờ:

try { 
     // some code 
    } 
    catch (IOException e) { 
     logger.info("Failed to do something, and cannot continue" + e.getMessage(), e); 
     e.printStackTrace(); 
     throw e; 
    } 

Đây có phải là điều đúng đắn nên làm gì? Nó sẽ thích hợp hơn nếu tôi chỉ ném ngoại lệ? Xin lỗi, tôi là một người mới ở trường hợp ngoại lệ :)

Trả lời

8

Bạn thường bắt được một ngoại lệ trong một phương thức khi bạn muốn chương trình của mình tiếp tục chạy. Bạn ném một ngoại lệ khi bạn muốn một phương thức mức cao hơn đang gọi phương thức đó để xử lý ngoại lệ thay thế. Ví dụ, bạn có thể ném nó trở lại phương thức chính của bạn, có một khối try..catch (có thể với các khối catch khác nhau cho các ngoại lệ khác nhau) đóng gói tất cả các cuộc gọi phương thức của bạn, và các ngoại lệ có thể được xử lý ở đó (ví dụ: kết thúc chương trình).

Hãy nhớ rằng việc ném ngoại lệ sẽ kết thúc phương pháp ngay lập tức. Điều này ảnh hưởng đến luồng mã của bạn. Nếu bạn có thể có một ngoại lệ ở giữa phương thức và mã bên dưới nó không thể chạy nếu ngoại lệ đó xảy ra, thì bạn sẽ cần phải quấn cả phần trong khối try/catch hoặc ném một ngoại lệ.

Lời khuyên chung chung - printStackTrace() rất tệ. Bạn có thể tạo ra đầu ra lỗi tốt hơn cho mình (và bạn có thể bao gồm dấu vết ngăn xếp cũng như với đầu ra của bạn). Thậm chí tốt hơn, sử dụng đăng nhập.

Tôi khuyên bạn nên đọc this introduction to exceptionsthis article which covers good and bad exception patterns.

1

Nếu ngoại lệ gây tử vong xảy ra, hãy bắt ngoại lệ và kết thúc chương trình của bạn một cách độc đáo. Rethrowing mà không đánh bắt sẽ chỉ giết chương trình của bạn.

0

Sau khi bắt tôi sẽ đăng nhập sự việc và sau đó làm những gì bạn cần để tắt máy gọn gàng và sau đó gọi System.exit nhưng tôi sẽ không ném ngoại lệ đó nữa.

0

Thực tiễn không tốt là phải chấm dứt chương trình của bạn do một ngoại lệ chưa được giải quyết. Nếu bạn bắt một ngoại lệ đó là gây tử vong và không thể phục hồi làm như sau:

  1. đăng nhập nó
  2. thực hiện bất kỳ dọn dẹp necissary
  3. chấm dứt chương trình
1

Nếu bạn biết ngoại lệ không phải là một cái gì đó bạn có thể xử lý, hãy để ngoại lệ đi mà không bắt nó ở nơi đầu tiên. Có một trình xử lý ngoại lệ để nắm bắt mọi thứ và ghi nó vào một tệp cùng với stacktrace. Ví dụ, nếu chương trình của bạn đang chạy từ dòng lệnh, bạn có thể nắm bắt mọi thứ trong phương thức chính và đăng nhập nó ở đó.

+0

Vì vậy, bạn đang nói rằng nếu tôi có một ngoại lệ mà tôi không thể xử lý bên trong phương pháp đó, tôi nên ném nó. Nhưng, nếu tôi có thể phục hồi từ nó bên trong cùng một phương pháp, thì đó là khi nó thích hợp để nắm bắt bên trong phương pháp. Ngoài ra, tôi có nên để ngoại lệ bắt cho (phương pháp, kiểm tra) thực hiện phương pháp cơ bản đã ném nó? –

+0

vâng, bạn chỉ bắt được những gì bạn có thể làm gì đó. tôi không hiểu phần cuối, bạn có thể nói lại điều đó không? –

+0

Xin lỗi về điều đó, hãy để tôi thử lại. Những gì tôi thực sự có nghĩa là để nói là khi tôi sử dụng một phương pháp ném một ngoại lệ trong một số bài kiểm tra đơn vị hoặc một phương pháp chính, và chúng ta hãy nói rằng tôi làm cho bài kiểm tra ném ngoại lệ. Điều gì xảy ra ở đó? Liệu nó chỉ cần bỏ thuốc lá? Nó có in thông báo lỗi không? Điều thích hợp nhất để làm trong tình huống này là gì? –

1


Bạn bắt giữ ngoại lệ khi bạn có liên quan gì đó với nó. Trong trường hợp của bạn - Viết vào nhật ký, hiển thị một tin nhắn cho người dùng và thoát theo cách có trật tự.
Bạn ném ngoại lệ khi bạn không thể làm gì khác khi điều đó xảy ra.

Tôi khuyên bạn nên sử dụng khối ứng dụng xử lý ngoại lệ của thư viện doanh nghiệp của Microsoft. Nó sẽ giúp bạn đối phó với ngoại lệ của bạn là một cách mà bạn sẽ có thể kiểm soát dòng chảy và thay đổi cấu hình.

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