파일을 읽고 쓸 때 발생하는 모든 예외를 어떻게 잡을 수 있습니까?


105

Java exceptions에서 예외를 개별적으로 catch하는 대신 모두를 가져 오는 (catch) 방법이 있습니까?


2
catch (Exception e) {} ??로 모든 특정 예외를 잡을 것입니다.
Johanna

네. Exception은 모든 예외의 기본 클래스이므로 모든 예외를 포착합니다.
jjnguy 2009-07-02

1
@ jjnguy : 좋은 설명에 감사드립니다.
Johanna

도움이되어 다행입니다.
jjnguy

답변:


111

원하는 경우 메서드에 throws 절을 추가 할 수 있습니다. 그러면 확인 된 메서드를 바로 잡을 필요가 없습니다. 이렇게하면 exceptions나중에 (아마도 other와 동시에) 잡을 수 있습니다 exceptions.

코드는 다음과 같습니다.

public void someMethode() throws SomeCheckedException {

    //  code

}

그런 다음 나중에 exceptions해당 방법으로 처리하고 싶지 않은 경우 처리 할 수 ​​있습니다 .

모든 예외를 포착하기 위해 일부 코드 블록이 던질 수 있습니다. (이것은 또한 Exceptions직접 작성한 것을 포착 합니다)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

작동하는 이유는 Exception모든 예외의 기본 클래스 이기 때문 입니다. 따라서 throw 될 수있는 모든 예외는 Exception(대문자 'E')입니다.

자체 예외를 처리하려면 먼저 catch일반 예외 앞에 블록을 추가하면 됩니다.

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

95

원시 예외를 포착하는 것이 좋은 스타일이 아니라는 데 동의하지만, 우수한 로깅을 제공하는 예외를 처리하는 방법과 예상치 못한 문제를 처리하는 기능이 있습니다. 예외적 인 상태이기 때문에 응답 시간보다 좋은 정보를 얻는 데 더 관심이있을 수 있으므로 성능 인스턴스가 큰 타격을 입어서는 안됩니다.

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

그러나 이것은 IO가 오류를 발생시킬 수 있다는 사실을 고려하지 않습니다. 오류는 예외가 아닙니다. 둘 다 기본 클래스 Throwable을 공유하지만 오류는 예외와 다른 상속 계층 아래에 ​​있습니다. IO가 오류를 던질 수 있으므로 Throwable을 잡을 수 있습니다.

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
여러 개의 catch 블록을 사용하지 않는 이유는 무엇입니까?
Carl G

1
각 예외를 명시 적으로 잡아야한다고 주장하지만,이 질문은 코드 블록이 던지는 모든 것을 잡아내는 방법을 명시 적으로 물었습니다.
codethulhu

그 던질 수있는 것은 유용했습니다.
Anshul

이것은 내가 찾고 있던 해결책이며 예외 처리를 위해 if else가 필요했습니다. 감사합니다
CubeJockey 2015-07-23

던질 수있는 팁은 정말 유용합니다.
cherryhitech

15

기본 예외 '예외'포착

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

8
이 코드를 작성하면 거의 확실히 끔찍한 잘못을하고있는 것입니다.
George

2
@George 왜 그렇게 말했습니까?
kuchi

10
@George 반드시 필요한 것은 아닙니다. 민감한 입력 매개 변수가 많고 각 매개 변수의 유효성을 확인하는 것이 매우 복잡하다면 작업 사례가 제대로 테스트되면 모든 종류의 예외를 포착하는 것이 좋습니다. . 그것은 크고 잠재적으로 무거운 조건보다 코드를 명확하고 덜 신경 쓰게 만들 것입니다.
Johnride 2013

2
대부분의 코더 그래서이 시도 캐치 조각을 사용하여, 자신의 catch 문에 넣어 아무것도 일한 실제로 더 나은 다른 예외 타입의 무리를 잡기 그것으로 아무것도 안하고보다
루 Morda을

1
@LouisMorda 동의하지 않습니다. 모든 Exception 하위 클래스를 포착하고이를 기반으로 아무것도하지 않는 것 (무시)은 특정 예외를 포착하고 무시하는 것보다 더 나쁩니다. 일부 Exception 유형을 포착하고 정보로 아무것도하지 않으면 해당 상황에서 무엇이 잘못되었는지 알 기회가 없지만 모든 Exception 하위 클래스를 포착하면 훨씬 많은 수에서 무엇이 잘못되었는지 알 수 없습니다. 상황의. 스택 추적 및 메시지와 같은 예외 정보없이 버그 보고서를 처리하는 방법을 고려하십시오.
zpon 2015-07-29

6

예외 를 잡는 것은 나쁜 습관입니다. 너무 광범위하고 자신의 코드에서 NullPointerException 과 같은 것을 놓칠 수 있습니다 .

대부분의 파일 작업에서 IOException 은 루트 예외입니다. 대신 그것을 잡는 것이 좋습니다.


1
예외를 잡는 것은 나쁜 습관입니다. 왜? downvote 나쁜 설명
페드로 Sequeira에게

4

네, 있습니다.

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

4

단일 catch 블록에서 여러 예외를 포착 할 수 있습니다.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

특정 예외가 아니라 던지는 Exception모든 유형 의 잡기를 의미 합니까?

그렇다면:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

구체적이지 않은 경우 어떻게해야합니까 ??
Johanna

catch (Exception e) {} ??로 모든 특정 예외를 잡을 것입니다.
Johanna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.