Làm thế nào tôi có thể nắm bắt tất cả các trường hợp ngoại lệ sẽ xảy ra khi đọc và ghi tệp?


105

Trong Java, có cách nào để lấy (bắt) tất cả exceptionsthay vì bắt riêng lẻ ngoại lệ không?


2
và tôi sẽ bắt tất cả các Ngoại lệ cụ thể đó bằng catch (Ngoại lệ e) {} ??
Johanna

vâng. Vì Exception là lớp cơ sở của tất cả các ngoại lệ, nó sẽ bắt bất kỳ ngoại lệ nào.
jjnguy

1
@ jjnguy: cảm ơn bạn đã giải thích tốt.
Johanna

Tôi rất vui vì nó hữu ích.
jjnguy

Câu trả lời:


111

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 exceptionssau (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 exceptionsnế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 Exceptionsbạ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ì Exceptionlà 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 catchkhối trước Ngoại lệ chung.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

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;
    }
}

12
Tại sao không sử dụng nhiều khối bắt?
Carl G

1
Tôi lập luận rằng bạn nên bắt từng ngoại lệ một cách rõ ràng, nhưng câu hỏi đặt ra một cách rõ ràng là làm thế nào để bắt mọi thứ mà một khối mã sẽ ném ra.
codethulhu

Có thể ném đó là hữu ích.
Anshul

Đây là giải pháp tôi đang tìm kiếm, tôi cần một if else để xử lý ngoại lệ. Cảm ơn
CubeJockey

Mẹo có thể ném thực sự hữu ích.
cherryhitech

15

Bắt ngoại lệ cơ sở 'Exception'

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
Nếu bạn viết mã này, bạn gần như chắc chắn đang làm một điều gì đó sai lầm khủng khiếp.
George

2
@George Tại sao bạn lại nói như vậy?
kuchi

10
@George Không nhất thiết, nếu bạn xử lý thứ gì đó có nhiều thông số nhập nhạy cảm và việc xác minh tính hợp lệ của từng thông số đó là rất phức tạp, thì việc bắt tất cả các loại ngoại lệ sau khi các trường hợp hoạt động được kiểm tra đúng cách là cách để thực hiện . Nó sẽ làm cho mã rõ ràng và ít phiền muộn hơn so với một điều kiện lớn và có khả năng nặng.
Johnride

2
Hầu hết các lập trình tôi đã làm việc với đặt không có gì trong báo cáo bắt họ, do đó sử dụng đoạn mã catch này là thực sự tốt hơn so với đánh bắt một loạt các loại ngoại lệ khác nhau và không phải làm bất cứ điều gì với nó
Lou Morda

1
@LouisMorda Tôi không đồng ý, bắt mọi lớp con Ngoại lệ và không làm bất cứ điều gì dựa trên chúng (bỏ qua chúng) còn tệ hơn là chỉ bắt một số ngoại lệ cụ thể và bỏ qua chúng. Nếu bạn nắm bắt một số loại Ngoại lệ và không làm gì với thông tin, bạn sẽ không có cơ hội biết điều gì đã xảy ra trong những tình huống đó, nhưng nếu bạn nắm bắt tất cả các lớp con Ngoại lệ, bạn sẽ không có cơ hội biết điều gì đã xảy ra với một số lượng lớn tình huống. Hãy xem xét cách bạn sẽ xử lý các báo cáo lỗi mà không có thông tin từ các trường hợp ngoại lệ, như dấu ngăn xếp và thông báo.
zpon

6

Đó 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 đó.


1
Thực hành không tốt để bắt Exception. tại sao? xấu downvote giải thích
Pedro Sequeira

4

Có, có.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

4

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.
} 

3

Ý 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...
}

Tôi nên làm gì cho những cái không cụ thể ??
Johanna

và tôi sẽ bắt tất cả các Ngoại lệ cụ thể đó bằng catch (Ngoại lệ e) {} ??
Johanna
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.