당신은 이상 처리 코드를 이렇게 썼습니까?

1669 단어
동료가 코드를 이렇게 쓰는 것을 자주 본다.
 
  
DataSet QueryDB()
{
   DataSet ds=null;

   try
    {
         //do something
    }
    catch (Exception ex)
    {
         //
    }

    return ds;
}


다음과 같은 몇 가지 질문이 있습니다.
1:분명히QueryDB 방법에 어떤 이상이 발생하면 클라이언트는 알 수 없다. 예를 들어 클라이언트가QueryDB 방법을 호출하면 이 방법은null로 되돌아온다. 이것은 데이터베이스에 이 데이터가 없다는 것을 의미한다.아니면 이상을 던진 건가요?
2: 주석은 존재하지 말아야 합니다. 주석은 실제 로그 기록 코드로 대체되어야 합니다. 예를 들어 Log.Write(ex);
3: 이 방법은 모든 이상을 포착한다. 이렇게 하면 모든 이상이 포착된다. 이것은 개발에 매우 불편하다. 당신이 처리할 수 없는 이상을 영원히 포착하지 마라.
4: 코드를 왜 이렇게 써요?설명은 진실한 사용자는 잘못된 정보를 보고 싶지 않다. 처음에 듣기에는 몇 가지 일리가 있는 것 같다. 어떤 사용자도 당신의 소프트웨어를 사용하고 이상한 것을 던지지 않을 거라고 생각해 보자. 그러나 이것은 배치된 후의 일이다. 개발한 프로그래머가 이상한 것을 보고 싶지 않은 것이 아니다.개발할 때 상세한 이상 정보를 볼 수 있다면 빠르게 수정하고 버그를 복구할 수 있는데 왜 기꺼이 하지 않겠는가?
다음과 같이 수정되었습니다.
 
  
DataSet QueryDB()
{
     DataSet ds = null;

     try
     {
           //do something
     }
     catch (Exception ex)
     {
          Log.Write(ex);
          throw ex;
      }

      return ds;
}


자, 이제 이상은 드디어 잡혔고, 던지는 데도 성공했어.
이 코드는 아직도 문제가 있습니까?
catch 문장 블록에서throw ex;throw로 수정하는 것이 좋습니다.
왜냐하면net에서 이상은 수정할 수 없습니다. 이상이 던져질 때마다 이상 추적 정보는 리셋됩니다.
Throw는 스택 추적 정보를 재설정하지 않지만throw ex;재설정됩니다.따라서 이상한 던지는 위치를 더욱 편리하게 찾기 위해throw문장을 사용하는 것이 좋다.throwex가 아니라throw문장을 사용하는 것이 좋다.그렇지 않으면clr는 이상이catch 문장 블록에서 던져졌다고 생각할 것입니다.
참고로 당신이 처리할 수 없는 이상을 포착하지 마세요. 앞으로 사용자가 이상 정보를 보지 못하길 바라면,
크게 AppDomain을 사용할 수 있습니다.또는 Application의 글로벌 예외 처리

좋은 웹페이지 즐겨찾기