Trong Java, có cách nào để lấy (bắt) tất cả exceptions
thay vì bắt riêng lẻ ngoại lệ không?
Trong Java, có cách nào để lấy (bắt) tất cả exceptions
thay vì bắt riêng lẻ ngoại lệ không?
Câu trả lời:
Nếu muốn, bạn có thể thêm mệnh đề ném vào các phương thức của mình. Sau đó, bạn không phải bắt các phương pháp đã kiểm tra ngay lập tức. Bằng cách đó, bạn có thể bắt exceptions
sau (có thể cùng lúc với cách khác exceptions
).
Mã trông giống như:
public void someMethode() throws SomeCheckedException {
// code
}
Sau đó, bạn có thể giải quyết exceptions
nếu bạn không muốn đối phó với chúng theo phương pháp đó.
Để nắm bắt tất cả các ngoại lệ, một số khối mã có thể ném bạn có thể làm: (Điều này cũng sẽ bắt Exceptions
bạn tự viết)
try {
// exceptional block of code ...
// ...
} catch (Exception e){
// Deal with e as you please.
//e may be any type of exception at all.
}
Lý do hoạt động là vì Exception
là lớp cơ sở cho tất cả các trường hợp ngoại lệ. Vì vậy, bất kỳ ngoại lệ nào có thể được ném ra đều là Exception
(Chữ hoa 'E').
Nếu bạn muốn xử lý các ngoại lệ của riêng mình, trước tiên chỉ cần thêm một catch
khối trước Ngoại lệ chung.
try{
}catch(MyOwnException me){
}catch(Exception e){
}
Mặc dù tôi đồng ý rằng việc bắt một Ngoại lệ thô là không tốt, nhưng có những cách xử lý các ngoại lệ mang lại khả năng ghi nhật ký tốt hơn và khả năng xử lý những điều không mong muốn. Vì bạn đang ở trạng thái đặc biệt, bạn có thể quan tâm đến việc nhận được thông tin tốt hơn là thời gian phản hồi, vì vậy hiệu suất của phiên bản không phải là một tác động lớn.
try{
// IO code
} catch (Exception e){
if(e instanceof IOException){
// handle this exception type
} else if (e instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
throw e;
}
}
Tuy nhiên, điều này không xét đến thực tế là IO cũng có thể tạo ra Lỗi. Lỗi không phải là ngoại lệ. Lỗi nằm dưới một hệ thống phân cấp kế thừa khác với Ngoại lệ, mặc dù cả hai đều chia sẻ lớp cơ sở Throwable. Vì IO có thể ném ra Lỗi, bạn có thể muốn đi xa hơn để bắt được Có thể ném
try{
// IO code
} catch (Throwable t){
if(t instanceof Exception){
if(t instanceof IOException){
// handle this exception type
} else if (t instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else if (t instanceof Error){
if(t instanceof IOError){
// handle this Error
} else if (t instanceof AnotherError){
//handle different Error
} else {
// We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else {
// This should never be reached, unless you have subclassed Throwable for your own purposes.
throw t;
}
}
Bắt ngoại lệ cơ sở 'Exception'
try {
//some code
} catch (Exception e) {
//catches exception and all subclasses
}
Đó là thực hành xấu để bắt Exception - nó quá rộng và bạn có thể bỏ lỡ một cái gì đó như NullPointerException trong mã của riêng bạn.
Đối với hầu hết các hoạt động tệp, IOException là ngoại lệ gốc. Tốt hơn nên nắm bắt điều đó, thay vào đó.
Có, có.
try
{
//Read/write file
}catch(Exception ex)
{
//catches all exceptions extended from Exception (which is everything)
}
Bạn có thể bắt gặp nhiều ngoại lệ trong một khối bắt duy nhất.
try{
// somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
// handle exception.
}
Ý của bạn là bắt một loạiException
bất kỳ loại nào được ném ra, trái ngược với chỉ các Ngoại lệ cụ thể?
Nếu vậy:
try {
//...file IO...
} catch(Exception e) {
//...do stuff with e, such as check its type or log it...
}