2010-03-04 6 views
0

현재 try 블록 다음에 두 개의 catch 블록을 사용하고 있습니다. 첫 번째 예외는 두 번째 예외 인 SqlExceptions를 포착합니다. SqlException에 특정 메시지가 없으면 일반 catch 블록에서 처리하도록합니다. 첫 번째 catch 블록에서 두 번째 catch 블록으로 예외를 전달할 수있는 방법이 있습니까? 아니면 코드를 복제해야합니까?특정 캐치에서 덜 구체적인 캐치로 예외 전달

답변

2

먼저 Exception을 잡으려면 스스로에게 문의해야합니다. 예외를 처리 할 수 ​​없으면 catch하지 않아야합니다.

코드를 복제하는 catch 블록간에 모든 종류의 예외를 처리하고 어떤 종류의 처리를 공유하려는 경우 올바른 방법이 아닙니다. 왜 처리 방법을 캡슐화하고 두 블록에서 호출을 호출할까요?

+0

슬프게도 (또는 운 좋게도) 이것은 내 코드가 아니므로 Exception catch 블록을 다시 작성하는 것이 나의 책임이 아닙니다. 현재 유일한 "처리"는 예외 메시지와 함께 MessageBox를 표시하는 것입니다. 지금은 자체 메서드로 추출하는 것이 과잉입니다. – Rawling

+0

그런 경우 일반적인 예외 처리를 제거하고 예외 처리를 모든 처리기로 포착 시키거나 응용 프로그램을 중단 시키도록하는 것처럼 들릴 수 있습니다. –

+0

내가 의미 한 것은, 일반적인 예외 잡기가 내 앞에 온 사람들에 따르면 정확하고, 그것을 시도하고 재 작성하는 나의 장소가 아니다! 최종 수정 : 특정 예외 catch 블록을 제거하고 일반 블록 내에서 예외 유형을 확인하기 만하면됩니다. 코드 중복이 없으며 특정한 유형의 예외가 아니라 특정 예외를 찾고 있기 때문에 더욱 의미가 있습니다. – Rawling

1

이 경우 코드를 복제해야합니다.

예외 블록에 예외를 다시 던져서 호출 함수가 처리하도록 할 수 있지만 예외를 낮은 하위 catch 블록으로 버블 블 취소 할 수는 없습니다.

1

catch 문이 중첩되지 않은 가정이 코드는 VB.Net에서 작동 :

Try 
    SomeCode() 
Catch ex As ArgumentException When ex.Message <> "" 
    Trace.WriteLine(String.Format("Caught argument exception with a message {0}", ex.Message)) 
Catch ex As Exception 
    Trace.WriteLine("Caught argument exception with no message, or some other type of exception") 
End Try 

SomeCode가 (빈 생성자를 사용하여 만든 경우 ArgumentException 등)는 것이다 메시지가있는 ArgumentExeption를 throw하는 경우 첫 번째 Catch 문에 의해 처리됩니다. 다른 모든 예외는 빈 메시지가있는 ArgumentException을 포함하여 두 번째 Catch 문에서 처리됩니다.

나는 VB.NET이 그것을 할 수 있다면, C#은 (그러나 가정은 끔찍하게 틀릴 수도있다).

편집 : 질문 : here 같이 C#에는 해당 코드 구조가없는 것 같습니다. 미안하다.

+0

이것은 내가하고 싶은 일입니다! 불행히도, C#이 지원하지 않는 것 같습니다. – Rawling

관련 문제