예외가 특정 유형인지 확인하는 방법


82

try catch 코드가 있습니다.

try 
{
    ...
}
catch(Exception ex) 
{
    ModelState.AddModelError(
        "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}

이 코드의 경우 데이터베이스에 레코드를 삽입하려고합니다. dba는 데이터베이스가 중복을 확인하고 중복이 있으면 오류를 반환하도록 설정했습니다. 현재 보시다시피 어떤 오류가 발생하더라도 동일한 오류를 모델에 추가하고 있습니다. dba에 의해 설정된 중복 오류로 인해 발생한 경우에만이 오류가 모델에 추가되도록 변경하고 싶습니다.

아래는 내가 잡으려는 오류입니다. 내부 예외에 있습니다. 아무도 구체적으로 이것을 잡는 방법을 말해 줄 수 있습니까?

여기에 이미지 설명 입력


1
Davide의 답변을 참조하십시오. 일반적으로 잡는 Exception것은 모범 사례가 아닙니다. 가능한 한 구체적이어야하며 처리 할 수없는 것은 사용자 / 프레임 워크에 표시되도록해야합니다.
라이언

1
이 답변을 체크 아웃 : stackoverflow.com/questions/3967140/...
롭 Packwood

답변:


141

현재 캐치 전에 다음을 추가하십시오.

catch(DbUpdateException ex)
{
  if(ex.InnerException is UpdateException)
  {
    // do what you want with ex.InnerException...
  }
}

C # 6에서 다음을 수행 할 수 있습니다.

catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
    // do what you want with ex.InnerException...
}

3
catch "when not"구문이 있습니까?
conterio

4
@conteriocatch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))

16

교체 System.Threading.ThreadAbortException하여 제외.

try
{
    //assume ThreadAbortException occurs here
}
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException)))
    {
         //what you want to do when ThreadAbortException occurs         
    }
    else
    {
         //do when other exceptions occur
    }
}

3

예외의 이름을 얻으려면 다음을 사용할 수 있습니다.

    catch (Exception exc){
       if (exc.GetType().FullName == "Your_Exception") 
       {
          // The same can be user for InnerExceptions
          // exc.InnerException.GetType().FullName
       }
   }

2
예외 유형을 문자열로 비교하는 것은 위험합니다. 불행한 철자 실수는 예외 처리를 악몽으로 만들 것입니다!
Tejas Pendse

동의합니다. 유형을 유형과 비교하십시오. exc.GetType () == typeof (YourException)
Lee Oades

2

댓글을 작성할 담당자가 충분하지 않습니다. @conterio 질문에 대한 응답 (@Davide Piras 답변) :

catch "when not"구문이 있습니까?

있습니다.

catch (Exception e) when (!(e is ArgumentException)) { }

-3

SQLException 클래스를 살펴보고 내부 예외에서 볼 수있는 내용이 포함되어있는 경우 예외 메시지의 내용을 확인할 수 있습니다.

try
{
    //your code here
}
catch (SQLException ex)
{
    if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
    {
        //your code here
    }
}

1
SqlException이 직접 throw되는 것은 아니지만 내부 예외로만 발생합니다. 또한 메시지 텍스트와 비교하는 것보다 오류 번호를 확인하는 것이 좋습니다.
John Saunders

네, 오류 번호도 확인할 수 있습니다. 댓글 주셔서 감사합니다.
Ann BG

오류 번호를 어떻게 확인합니까? 나는 그것이 정말로 특정한 오류이기 때문에 그것이 숫자가 무엇인지 확실하지 않습니까?
AnonyMouse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.