Sự khác biệt giữa việc sử dụng throwable và Exception trong một lần thử


Câu trả lời:


247

Bằng cách bắt Throwablenó bao gồm những thứ mà phân lớp Error. Nói chung, bạn không nên làm điều đó, ngoại trừ có lẽ ở mức "bắt tất cả" cao nhất của một luồng mà bạn muốn đăng nhập hoặc xử lý hoàn toàn mọi thứ có thể sai. Nó sẽ là điển hình hơn trong một ứng dụng loại khung (ví dụ: máy chủ ứng dụng hoặc khung thử nghiệm) nơi nó có thể chạy mã không xác định và không bị ảnh hưởng bởi bất kỳ điều gì sai với mã đó, càng nhiều càng tốt.


30
Có lẽ sẽ là tốt nhất để giải thích một chút về thứ bậc ở đây.
Xonatron

11
Bối cảnh cho câu trả lời này: throwable bao gồm cả Lỗi và Ngoại lệ dưới dạng các lớp con, vì vậy lần thử / bắt đầu tiên bao gồm lần thứ hai nhưng thường quá rộng.
Noel

2
Nó cũng bao gồm các lớp con trực tiếp do người dùng định nghĩa là throwable và các thể hiện của chính throwable. Không có gì ngăn cản bạn viết throw new Throwable();, vì vậy đó là cách duy nhất để thực sự nắm bắt mọi thứ.
Antimon

3
Mặc dù được chấp nhận, nhưng điều này không trả lời câu hỏi vì hầu hết câu trả lời mô tả một cách thực hành tốt nhất để nắm bắt cả Ngoại lệ và Có thể ném được, và câu hỏi là về sự khác biệt (như khi nào tôi nên sử dụng khi nào tôi muốn). "Nó bao gồm những thứ mà Lỗi lớp con" là sự khác biệt duy nhất được chỉ định và đó thực sự là một câu trả lời toàn diện: Lỗi là gì? Tại sao nó bao gồm nó? Bất kỳ sự khác biệt hoặc thực hành tốt nhất khác?
Oded Niv

@OdedNiv "Lỗi là gì? Tại sao nó bao gồm nó?" bạn có thể hỏi những người trong một câu hỏi khác
Kronen

182

Lớp thứ nhất bắt tất cả các lớp con của Throwable(bao gồm ExceptionError), lớp thứ hai bắt tất cả các lớp con của Exception.

Errorlà chương trình không thể phục hồi theo bất kỳ cách nào và thường không bị bắt, ngoại trừ mục đích ghi nhật ký (thông qua nó một lần nữa). Exceptioncó thể phục hồi theo chương trình. Lớp con của nó RuntimeExceptionchỉ ra lỗi lập trình và thường không được bắt gặp.


37
Thật đáng ngạc nhiên, 4 năm sau câu trả lời này, hầu hết các công cụ "phân tích mã" vẫn sẽ báo cáo việc bắt lỗi là một lỗi nghiêm trọng . Ghi nhật ký là một lý do rất hợp lệ để bắt Ném. Nhiều năm phát triển máy chủ cho tôi biết rằng 1) Ghi nhật ký sẽ xảy ra mặc dù có Errorvà 2) Trừ khi có ghi nhật ký, bạn có thể không bao giờ được thông báo rằng OOM đã xảy ra, khiến bạn tự hỏi tại sao máy chủ bắt đầu hành xử "buồn cười"
Bruno Grieder

4
Không gì programmatically unrecoverablecó nghĩa là chính xác? Nó có nghiêm trọng đến mức về cơ bản chúng ta không thể gọi bất kỳ phương thức Java nào sau khi bắt được nó nữa không (ghi nhật ký, v.v.) mà không có cơ hội nhận được một hành vi không thể đoán trước từ JVM?
Alexander Abakumov

Its subclass RuntimeException indicates a programming error: Không chắc chắn nếu tôi đồng ý với tuyên bố này. Nếu đó là sự thật, điều đó có nghĩa là tất cả các ngoại lệ dự kiến ​​sẽ được kiểm tra ngoại lệ. Điều gì sẽ xảy ra nếu tôi mong đợi một cái gì đó có thể thất bại và không thể phục hồi được bởi ứng dụng của tôi, nhưng tôi ít nhất muốn ném một ngoại lệ có ý nghĩa? Sử dụng một ngoại lệ được kiểm tra trong trường hợp đó dường như vô dụng và tạo mã soạn sẵn.
Nom1fan

22

Thowablenắm bắt thực sự mọi thứ ngay cả ThreadDeath được ném theo mặc định để ngăn chặn một luồng từ Thread.stop()phương thức hiện không dùng nữa . Vì vậy, bằng cách bắt Throwablebạn có thể chắc chắn rằng bạn sẽ không bao giờ rời khỏi khối thử mà ít nhất là đi qua khối bắt của bạn, nhưng bạn nên chuẩn bị để xử lý OutOfMemoryErrorInternalErrorhoặc StackOverflowError.

Việc nắm bắt Throwablelà hữu ích nhất đối với các vòng lặp máy chủ bên ngoài ủy thác tất cả các loại yêu cầu cho mã bên ngoài nhưng bản thân nó có thể không bao giờ chấm dứt để giữ cho dịch vụ tồn tại.


21

Throwablelà siêu hạng Exceptioncũng như Error. Trong các trường hợp bình thường, chúng ta phải luôn luôn bắt các lớp con Exception, để nguyên nhân gốc không bị mất.

Chỉ những trường hợp đặc biệt mà bạn thấy khả năng xảy ra sự cố không kiểm soát được mã Java của mình, bạn nên nắm bắt Errorhoặc Throwable.

Tôi nhớ đã bắt được Ném để đánh dấu rằng thư viện riêng không được tải.


0

Tôi đã thấy mọi người sử dụng throwable để bắt một số lỗi có thể xảy ra do lỗi không có / không có sẵn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.