2010-11-24 4 views
10

C#은 컴파일 필터를 지원합니까? 필터는 어떻게 작동합니까? 또는 무엇을합니까? 반사처럼C# 예외 필터?

과 같이 작동 방식에 대한 VB는 C#을 6까지하는 것처럼 예외 필터를 지원하지

try 
{ 
} 
catch(Exception e) when (?) 
{ 
}
+0

당신이 원하는 더 나은 정의 또는 예제를 추가 할 수 있습니다 읽기 필터 : –

+0

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf, # 23.3 : 예외 처리 방법 –

+2

참조 : http://stackoverflow.com/questions/181188/c-equivalent-to-vb-net-catch-when –

답변

5

C 번호와 같은 필터를 컴파일 해제, 에릭 Lippert의의 "Finally" Does Not Mean "Immediately"

는 C# 6, 예외 시작을 참조하십시오 필터는 the C# FAQ demonstrates로 지원됩니다

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

parenthesi이 경우, 'if'[now when] 다음에 zed 표현식이 true로 평가되면 catch 블록이 실행되고, 그렇지 않으면 예외가 계속 유지됩니다.

스택을 손상되지 않게 유지하기 때문에 예외 필터는 catch 및 rethrowing보다 바람직합니다. 나중에 예외가 발생하면 스택을 덤프 할 수 있습니다. 스택이 다시로드 된 마지막 위치가 아니라 원래 어디에서 왔는지 확인할 수 있습니다.

또한 부작용을 위해 예외 필터를 사용하는 "남용"의 일반적인 형태입니다. 예 : 벌채 반출. 그들은 코스를 가로 채지 않고 "날아가는"예외를 검사 할 수 있습니다. 이러한 경우에서, 필터는 종종 부작용을 실행 거짓을 반환하는 도우미 함수를 호출 할 : C# 6 문서에 링크 Mafii

private static bool Log(Exception e) { /* log it */ ; return false; } 
… 
try { … } 
catch (Exception e) when (Log(e)) {} 

감사합니다.

+0

그래, 필터는 기본적으로 if 문일 뿐이고, 그것이 충족되지 않으면 그것을 rethrows? – Will

+3

아니요 실제 필터가 예외를 처리하기로 결정한 경우 실제 필터가 catch하지 않기 때문에 미묘하게 다릅니다. 반면에 if를 사용하여 문제를 해결하고 다시 throw합니다. 이것은 stack-unrolling과 관련된 약간 다른 의미를 갖는다. – CodesInChaos

+0

실행 시점도 다릅니다. callstack에서 필터가 더 깊게 정의되어 있어도 catch 블록 앞에 필터가 실행됩니다. –

23

C# 6부터 이제이 작업을 수행 할 수 있습니다.

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

이 스택을 긴장되지 예외 필터를 사용 catch 블록 내에서 if 문을 사용하여 상이하다. C#에서

4

예외 필터 지원은 C# 6 (비주얼 스튜디오 "Dev14")에서 소개 : 예외를 잡는 동안 다음 예외 필터를 사용할 수 있습니다 다르게 예외를 처리 할 경우,

try 
{ 
    throw new ApplicationException("1"); 
} 
catch (ApplicationException ex) when (ex.Message == "2") 
{ 
    // this one won't execute. 
} 
catch (ApplicationException ex) when (ex.Message == "1") 
{ 
    // this one will execute 
} 
+2

C# 6의 최종판에서'if'가'when'으로 대체되었습니다. – Mafii

0


- VB 7.1 후

1) C#을 샘플 후 C# 6.0

사용 - C# 6.0

try 
{ 
    throw new CustomException { Severity = 100 }; 
} 
catch (CustomException ex) when (ex.Severity > 50) 
{ 
    Console.WriteLine("*BING BING* WARNING *BING BING*"); 
} 
catch (CustomException ex) 
{ 
    Console.WriteLine("Whooops!"); 
} 

참고 : 순서는 코드의이 작품은 이전에 동일한 때문에 C# 6.0

try 
{ 
    throw new CustomException { Severity = 100 }; 
} 
catch (CustomException ex) 
{ 
    if (ex.Severity > 50) 
    { 
     Console.WriteLine("*BING BING* WARNING *BING BING*"); 
    } 
    else 
    { 
     Console.WriteLine("Whooops!"); 
    } 
} 

전에

2)의 C# 샘플을 중요한 있음을 유의하십시오. 의미, 그들은 동등한가?--- "하지만 그들이 동등하지 않은는"
는 참고 : 예외 필터가 스택을 긴장하지 않는

은 더에서 Here