[c#] 예외가 특정 유형인지 확인하는 방법

try catch 코드가 있습니다.

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

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

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

여기에 이미지 설명 입력



답변

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

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...
}


답변

교체 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
    }
}


답변

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

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


답변

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

catch “when not”구문이 있습니까?

있습니다.

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


답변

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

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


답변