2012-06-06 4 views
3

C#의 예외 처리 범위는 무엇입니까? 나는 현재 내 팀의 다른 프로그래머가 일부 코드를 검토하고 그는이 같은 다소 배치하는 기능을 가지고 : 처리 코드의C# 예외 처리 범위

private void function1() { 
try { 
function2(); 
} 
catch (Exception ex) { 
EmailException(ex.message()); 
}} 

private void function2() { 
try { 
// Do stuff 
} 
catch (Exception ex) { 
// Handle it here 
}} 

일괄 기능 2입니다. 그러나 그의보고 처리는 기능 1에 있습니다. function2의 예외가 보고서를 보내는 function1 처리기로 되돌아 갑니까?

편집 : 답장을 보내 주셔서 감사합니다. 모두 도움이되었습니다.

+0

예외 처리를위한 훌륭한 가이드로 Eric Lippert의 [this post] (http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx)를 확인하십시오. – RobertMS

답변

0

같이 retrown되는 예외 기능 2의 시도 블록에서 발생 FUNCTION2의 예외 블록

  • 예외가 발생할 때, 시스템상의 중첩 try 블록을 검색한다에서 trow 또는 trow ex stack을 사용하여 예외를 catch 할 수있는 catch 블록이 있는지 판별하십시오. 이는 finally 블록이 실행되기 전에 발생합니다. 예외를 catch 할 수있는 블록이 없으면 시스템은 finally 블록을 실행하지 않고 "처리되지 않은 예외"처리기를 호출합니다.

    중 하나는 모든 방법 catch 블록 스택 풀릴 때까지 예외를 잡을 수있는 블록이 있다고 결정 하는가 시스템, 그것은 스택을 풀기 시작하고 내부 try 블록과 관련된 finally 블록을 실행할 경우 발견했거나 finally 블록을 실행할 때 예외가 발생합니다. 후자의 경우 이전 예외는 포기되고 더 처리되지 않습니다. 예외 처리는 새로 throw 된 예외와 함께 새로 시작됩니다.

    캐치 예외하고자 간의 의미 론적 차이가 있지만, 단지 그것에 법 (그러나이 캐치되지 않는 것으로 간주 될 수 있도록)하고 싶은 대, C#에서 그 차이를 표현하는 더 깨끗한 방법이 없다; 예외를 포착하는 코드는이를 해결할 것으로 예상됩니다. C#에서 할 수있는 최선의 방법은 catch (시스템의 예외 처리 논리에서 예외를 잡아낼 것임을 나타냄)을 사용하고 throw을 사용하여 결국 문제를 해결하고 싶지 않음을 나타냅니다 내부 "finally"블록이 실행 된 후 발생합니다). vb.net과 같은 다른 언어에서는 finally 블록이 실행되기 전에 catch를하지 않고 예외를 처리 할 수 ​​있습니다. catchthrowcatch없이 예외를 캡처하는 것과 다른 경우가 많지만 구분이 중요한 경우는 거의 없습니다. C#을 사용하고 있고 파이널 라이저 블록이 실행되기 전에 내부 코드에서 예외를 포착하려는 주변 코드에 적대하지 않으려면 vb로 작성된 예외 처리 래퍼 메서드를 작성하는 것이 가장 좋습니다 (또는 다른 누군가에게 DLL로 컴파일 한 다음 lambda를 사용하여 적절한 try/filter/catch/finally 블록 내에서 호출 할 수있는 함수 메소드를 제공합니다.

  • 2

    아니요, 예외가 catch 될 때까지 만 전파합니다 (예외 :).

    그러나, 당신이 원하는 행동을지도하는 catchfunction2의 말에 예외를 다시 발생 할 수 있습니다

    private void function2() { 
        try { 
         // Do stuff 
        } 
        catch (Exception ex) { 
         // Handle it here 
         throw; // <- Re-throw the exception. 
            // Note this is different from `throw ex;` 
        } 
    } 
    
    4

    예외를 다시 발생하지 않습니다 // Handle it here 가정, function1는 원래의 예외를 볼 수 없을 것입니다 .

    function2 그것이 function1에 잘못 할 수 EmailException 가능성이 훨씬 좋아하지만 그 catch새로운 문제를 제기 할 수 있습니다.

    4

    에만

    a) function2 다시 발생 throw 원래 예외 또는 throw new ...

    B로 새로운 예외) 예기치 않은 예외 (function2의 캐치 블록의 내부 또는 그 이후에 발생을하는 사실에 이 경우는 catch 블록이 function2에서 마지막으로 발생하므로 불가능합니다.

    2

    function2의 예외는 보고서를 보내는 function1 처리기로 되돌아 갑니까?

    없음

    • 하지 않는 예외는 예외가 기능 2 예외 블록 내에서 발생
    • 이 예외는, 예를 들어
    • 을 발생합니다 기능 2의 try 블록의 외부에서 발생하는 자동 닷넷 ThreadAbortException