Đô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 Throwable
nó 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 Exception
và Error
), lớp thứ hai bắt tất cả các lớp con của Exception
.
Error
là 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). Exception
có thể phục hồi theo chương trình. Lớp con của nó RuntimeException
chỉ ra lỗi lập trình và thường không được bắt gặp.
Error
và 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 unrecoverable
có 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.
Thowable
nắ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 Throwable
bạ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ý OutOfMemoryError
và InternalError
hoặc StackOverflowError
.
Việc nắm bắt Throwable
là 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.
Throwable
là siêu hạng Exception
cũ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 Error
hoặ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.