2010-06-21 3 views
6

.NET에서 예외를 포착 할 때 항상 파생 예외 (예 : ArgumentException이 아닌 파생 된 유형)를 catch해야합니까?파생 된 예외 대부분을 잡으시겠습니까?

또한

:

내가 오류 코드를 사용하도록 요청하고 경우이 그렇게?

던져 새로운 예외 ("4000", 예)처럼 생성자에있을 것입니다;

또는 오류 코드 속성이있는 사용자 정의 예외 유형? SQL Server 오류로 매핑되는 오류 코드가있는 SqlException 같은 예외 유형과 혼동을 일으킬 수 있습니다. 당신이 정확한 예외 또는 예외의 다른 유형의 그룹을 잡을려면

감사

+0

여기서 오류 코드의 출처는 무엇입니까? 그 오류 코드는 네이티브 Win32 오류 코드입니까? –

답변

6
  1. 처리 방법을 알고있는 가장 넓은 예외를 찾으십시오.

    일반적으로 이것은 매우 구체적인 예외를 잡는 것을 의미합니다. 그리고 ArgumentException과 같은 일부 예외는 런타임 오류와 달리 논리 오류를 나타내는 b/c를 모두 잡아서는 안됩니다. File I/O의 경우 더 광범위한 예외를 잡는 것이 한 곳에서 발견되었습니다. IOException은 실제보다 높은 수준의 예외를 잡을 수 있습니다.

  2. 오류 코드를 사용하라는 메시지가 표시되는 경우 예외 메시지 속성을 사용하여 해결할 수는 있지만 적절히 형식화 된 예외가 발생하지 않도록하는 이유로 사용하지 않을 것입니다. 여기에는 두 가지 우려가 있습니다.

    a. 오류 코드는 현장에서 오류가 발생했을 때 조회 할 수있는 특정 정보를 제공하기위한 것입니다. 프로그래밍 언어로 예외 유형을 구별하기 위해이 언어를 구별하지 않아야합니다. 예를 들어, 예외 유형.

    b. 적절히 형식화 된 예외는 예외를 구별 할 수있는 프로그래밍 방식을 제공합니다. 언어는 그것을 위해 설계되었습니다. 평야를 던지지 마십시오 Exception.

    나는 아마도 Exception.Data collection에 오류 코드를 던질 것입니다. 이렇게하면 Exception.Message의 메시지를 덮어 쓰지 않아도되고 그렇지 않으면 진단 목적으로 매우 유용합니다.

+0

많은 다른 유형보다 "심각합니다"ArgumentException에 대해 일반적으로 많은 근거가 있는지 확신하지 못합니다. 예외를 잡을 때 정말로 알아야 할 것은 시스템의 상태 (예외를 던진 루틴이 영향을 주는지 여부)입니다.예를 들어 파일을 구문 분석 할 때 인수가 유효하지 않은 경우 ArgumentException을 throw하는 루틴을 호출하기 전에 모든 필드의 유효성을 검사하는 데 많은 가치가 있는지 확신 할 수 없습니다. 그래서 나는 그것이 "논리 오류"를 함축하고 있음을 거의 볼 수 없다. – supercat

2

이에 따라 달라집니다.

때로는 1 개의 정확한 예외에 대해서만 처리를 추가하려고합니다. 다른 경우 예외 처리는 모든 유형의 예외에 대해 동일하므로 catch를 그냥 넣거나 Exception을 catch하여 예외가 무엇인지 확인하십시오.

예를 들어 정확한 예외 하나만 포착하고 다른 예외 처리는 포착 할 수 있습니다. 호출 스택을 더 많이 알았을 때 나머지 예외를 잡았지만 정확하게 잡는 중 하나만 무시하려면이 작업을 수행하십시오.

관련 문제