Đôi khi, tôi thấy
try {
} catch(Throwable e) {
}Và đôi khi
try {
} catch(Exception e) {
}Sự khác biệt là gì?
Đôi khi, tôi thấy
try {
} catch(Throwable e) {
}Và đôi khi
try {
} catch(Exception e) {
}Sự khác biệt là gì?
Câu trả lời:
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.
throw new Throwable();, vì vậy đó là cách duy nhất để thực sự nắm bắt mọi thứ.
                    Lớp thứ nhất bắt tất cả các lớp con của Throwable(bao gồm Exceptionvà Error), 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.
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"
                    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?
                    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.
                    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ý OutOfMemoryErrorvà InternalErrorhoặ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.
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.
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.