현재 try 블록 다음에 두 개의 catch 블록을 사용하고 있습니다. 첫 번째 예외는 두 번째 예외 인 SqlExceptions를 포착합니다. SqlException에 특정 메시지가 없으면 일반 catch 블록에서 처리하도록합니다. 첫 번째 catch 블록에서 두 번째 catch 블록으로 예외를 전달할 수있는 방법이 있습니까? 아니면 코드를 복제해야합니까?특정 캐치에서 덜 구체적인 캐치로 예외 전달
답변
먼저 Exception
을 잡으려면 스스로에게 문의해야합니다. 예외를 처리 할 수 없으면 catch하지 않아야합니다.
코드를 복제하는 catch 블록간에 모든 종류의 예외를 처리하고 어떤 종류의 처리를 공유하려는 경우 올바른 방법이 아닙니다. 왜 처리 방법을 캡슐화하고 두 블록에서 호출을 호출할까요?
이 경우 코드를 복제해야합니다.
예외 블록에 예외를 다시 던져서 호출 함수가 처리하도록 할 수 있지만 예외를 낮은 하위 catch 블록으로 버블 블 취소 할 수는 없습니다.
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#에는 해당 코드 구조가없는 것 같습니다. 미안하다.
이것은 내가하고 싶은 일입니다! 불행히도, C#이 지원하지 않는 것 같습니다. – Rawling
- 1. 캐치에서 로그 저장 프로 시저로 오류 정보 전달
- 2. jquery로 덜 구체적인 클릭 이벤트를 무시하는 가장 좋은 방법은 무엇입니까?
- 3. 메뉴를 통해 예외 유형 전달
- 4. WCF에서 응답의 일부로 예외 전달
- 5. 자바 : 잡기 특정 예외
- 6. 포인터 참조를 사용하여 특정 배열 요소 전달
- 7. 특정 예외 오류는 디버거에서만 발생합니까?
- 8. ASP.net/C#의 오류 화면에 예외 전달
- 9. MVC 응용 프로그램에서 스레드 간 예외 전달
- 10. WCF REST를 통한 유효성 검사 예외 전달
- 11. LINQ는 포함 덜
- 12. javascript보다 덜/큰 탈출
- 13. 스핑크스 연산자 "덜"
- 14. XML 예외 캐치
- 15. javame의 자체 예외
- 16. 구체적인 구문 트리로 무엇을합니까?
- 17. 퍼지 로직의 구체적인 예
- 18. 구체적인 구현이란 무엇입니까?
- 19. 부울 대보다 구체적인 변수
- 20. 보다 구체적인 유형은 생성자
- 21. 목록에있는 구체적인 구현을 반환하십시오.
- 22. observableArray에서 구체적인 요소 얻기
- 23. RhinoMocks - 구체적인 유형 조롱 - 구체적인 유형의 모의 만들려고, 내가 다음 줄을 가지고 실행 생성자
- 24. 오리 타이핑 - 구체적인 유형이 필요할 때는 어떨까요?
- 25. 덜 CSS로 jQuery Mobile의 CSS 스타일 지움
- 26. 예외 잡는 순서?
- 27. 네임 스페이스 재정의 예외 XmlTextWriter의 특정 방법
- 28. Compact Framework Non Culture 특정 예외 메시지
- 29. 클래스 특정 예외 클래스를 포함 할 위치
- 30. 플랫폼 독립적 설계에 플랫폼 특정 데이터 전달?
슬프게도 (또는 운 좋게도) 이것은 내 코드가 아니므로 Exception catch 블록을 다시 작성하는 것이 나의 책임이 아닙니다. 현재 유일한 "처리"는 예외 메시지와 함께 MessageBox를 표시하는 것입니다. 지금은 자체 메서드로 추출하는 것이 과잉입니다. – Rawling
그런 경우 일반적인 예외 처리를 제거하고 예외 처리를 모든 처리기로 포착 시키거나 응용 프로그램을 중단 시키도록하는 것처럼 들릴 수 있습니다. –
내가 의미 한 것은, 일반적인 예외 잡기가 내 앞에 온 사람들에 따르면 정확하고, 그것을 시도하고 재 작성하는 나의 장소가 아니다! 최종 수정 : 특정 예외 catch 블록을 제거하고 일반 블록 내에서 예외 유형을 확인하기 만하면됩니다. 코드 중복이 없으며 특정한 유형의 예외가 아니라 특정 예외를 찾고 있기 때문에 더욱 의미가 있습니다. – Rawling