2014-07-08 2 views
1

나는 C#을 사용 중이고 try/catch에서 예외를 다시 발생시키고 나중에 catch 문을 다시 호출 할 수 있는지 궁금해하셨습니까?예외 재발행 및 다시 잡기

try { 
// 1. Try some operation 
    //Failed operations 

// 2. Throw an exception 
    throw new IOException("I tried my best"); 
} catch(IOException) { 
// 3. Try some specific recovery operation 
    //Failed operations 

//4. Rethrow and try again 
    throw; 
} 

... Some more specific exception handlers 

} catch(Exception) { 
// 5. Re-caught here as a last-ditch effort, generic recovery operation 
    //Process here 
} finally { 
    //... 
} 
+0

try/catch 블록을 중첩 할 수 있습니다. – NicoD

+0

답변 : 예! 하지만 다른 범위에서만 :) –

+0

같은 try-catch는 아니지만 상위 레벨 –

답변

3

만 catch 문 예를 들어, 다른 시도/캐치에 발생하는 경우 대신

try{ 

    ... 

    try{ 
     ... 
    } 
    catch(ExceptionA a) 
    { 
     throw; 
    } 
    catch(Exception e) 
    { 
     //will not not catch ExceptionA (rethrow or not) 
    } 
} 
catch(ExceptionA a) 
{ 
    //this would catch the re-throw 
} 
catch(Exception e) 
{ 
} 

가 왜 일반 Exception를 잡을하지 않는 한 다음 예외 유형을 구분? 귀하의 코드가 작동해야 finally

System.Exception thrownException = null; 
try{ 
     ... 
    } 
    catch(ExceptionA a) 
    { 
     thrownException = a; 
     ... // do special handling... 
    } 
    catch(ExceptionB b) 
    { 
     thrownException = b; 
     ... // do special handling... 
    } 
    catch(Exception e) 
    { 
     ... 
    } 
    finally{ 
    if (thrownException != null) { 
      ... //case the type here or use some other way to identify.. 
    } 
    } 
+0

좋아 ... 그게 내가 두려웠 던 것입니다. 고마워. –

+0

만약 내가 뜻을 느끼면, 나는 'goto's ...를 사용할 수 있었다. 그러나 나는 그것을 느끼지 않았다. :) –

+0

왜 예외를 잡아 예외 타입을 찾지 않는가? –

-1

try{ 
     ... 
    } 
    catch(Exception e) 
    { 
     if (e is ExceptionA){ 
      ... 
     } 
    } 

또는 넣어 논리는, 그러나 진짜 문제는 뭔가 잘못된 것으로, 예외는 사실을 외부 코드 부분을 알리는 데 사용되어야한다는 것이다. Throwing 수동으로 try 섹션에서 예외를 catch하고 다음 catch 섹션에서 예외를 catch하는 것은 의미가 없습니다. IO 작업을 처리 할 수 ​​없다는 것을 알고 있다면 if-else 문을 사용하여 즉시 처리하십시오. try-catch를 사용하는 것은 의심의 여지없이 비효율적 인 방법입니다.

+0

이것은 실제 코드의 스냅 샷이 아닌 간단한 예입니다. 또한'try/catch' 문이 오류 처리 조건에서 주 코드를 분리하여 수행해야 할 작업을 정확하게 수행하고 있기 때문에 이것이 나쁜 실행이라고 동의하지 않습니다. 이 두 작업을 혼합해서는 안됩니다. 또한 효율성에 대한 우려가있는 경우 예외가 발생하면 스택 해제가 발생하지 않으므로이 경우 무시해도됩니다. –

+0

또한 제 예제가 작동하지 않습니다. –

+1

@ spryno724 아니요, try/catch는 방금 try 섹션에서 생성 한 오류를 처리하지 않아야합니다. 내부 오류를 처리해야합니다. try/catch가 간단한 if-else 문보다 어떤 이점을 제공합니까? – Tarec

-2

확실하지 않음 (변수 범위 때문에 C#이 현재 사용하고있는 언어가 아니며 새로운 추가 변수로 인해 부작용이 발생할 수 있기 때문에 은 좋은 코딩 방법이 아닙니다.)하지만 작동합니다 :

try{ 
    ... 
} 
catch(ExceptionA a) 
{ 
    exception = a; // "Store" the exception in a variable 
} 
catch(Exception e) 
{ 
    //will not not catch ExceptionA (rethrow or not) 
} 

try 
{ 
    if (exception) 
     throw exception; // kind of rethrow if variable is set 
} 
catch(ExceptionA a) 
{ 
    //this would catch the re-throw 
} 
catch(Exception e) 
{ 
}