2014-06-17 2 views
0

나는 다음과 같은 코드를 가지고 있고 예외에 대한 자세한 정보는 제공하기 위해 노력하고있어 :항상 내부 예외를 유지해야합니까?

int id = 5; 
try 
{ 
    var record = db.MyTable 
        .Where(x.Id == 5) 
        .Single(); 
    // more code here ... 
} 
catch (InvalidOperationException ex) 
{ 
    string message = string.Format("Record doesn't exists for Id {0}", id); 
    throw new InvalidOperationException(message, ex); 
} 

나는이 예외 스택 트레이스가 아닌 다른 많은 관련 정보를 제공하지 않는 경우에도 내부 예외를 유지해야을? 위 코드처럼 또는;

예외를 무시하고 필요한 것을 던져야합니까? like throw new InvalidOperationException(message);

+5

로직을 구동하기 위해 예외를 사용하는 이유는 무엇입니까? 'Single()'대신'FirstOrDefault()'를 사용하고 결과를 검사하십시오. 그런 다음 항목이없는 경우 예외를 throw 할 수 있습니다. – xxbbcc

+0

예외에 대해 신경 쓰지 않는다면 오류로 포함시키지 마십시오. 그것은 당신이 결정할 사항입니다. 그렇다면 다시, 해를 끼치는 데 어떤 해가됩니까? 어쩌면 나중에 필요할거야. – vcsjones

+0

@vcsjones의 경우 결과는 'MyTable'에 들어있는 값이됩니다. 아마도 정수가 아니라 데이터 엔티티가 될 것입니다. 물론, 묻는 사람은 확실히 알 수있는 위치에있는 유일한 사람입니다. –

답변

1

질문하는 질문은 실행중인 작업에 따라 다릅니다. 내가 너라면 나는 가능한 한 내부 예외를 항상 지킬거야. 위의 예제에서 내부 예외는 필요하지 않을 수 있습니다.

하지만 내부 예외를 잃어 버리게된다, 당신은 같은 표시를 잡아 다시 발생하면 우리가 위의에서이 시나리오

public class EmployeeDAO 
{ 
    public void EmployeeInsert(Employee emp) 
    { 
     try 
     { 
      //Insert a Employee 
     } 
     catch (Exception ex) 
     { 
      string message = string.Format("Record doesn't exists for Id {0}", id); 
      throw new Exception(message, ex); 
     } 
    } 
} 

을 보자. 내부 예외에는 연결 문제 또는 명령 시간 초과 또는 해당 종류의 유용한 정보가 있습니다. 구별 할 수있는 일반적인 방법이 없기 때문에 같은 것들에 대한 기존의 예외 타입의

+0

예외로 제공되는 정보는 다른 "소비자"에게도 유용합니다. 내부 정보로 인해 해킹 프로그램/사이트가 더 쉽게 만들어 지므로 더 많은 사람들이 폭로하는 정보가 더 많을 수 있습니다 (대부분은 합법적 인 사용자가 아니더라도). –

+0

@AlexeiLevenkov. 예, 우리는 WCF 서비스를 노출하고자 할 때 예외를 처리하고 우아한 메시지를 반환해야합니다.예외 정보가 반환되지 않아야하는 곳 그렇더라도 개발자의 목적을 위해 예외가 올바르게 기록되어야합니다. – Sreenath

0

사용 위, 추악한 수 있습니다 일치하는 레코드의 수를 던져 누가 받 InvalidOperationException에서, 정확히 한 없었기 때문에 Single이를 슬로우 InvalidOperationException 완전히 다른 이유로. 일부 예상치 못한 이유로 InvalidOperationException이 발생하고 이유를 예상 한 것처럼 예외를보고하면 문제 해결이 어려울 수 있습니다. 반면에 예외를 지키면 클라이언트가 어떤 일을 할 것인지 명확하게 알 수 없습니다.

예외 메시지를 기반으로 의사 결정을 내리는 것이 일반적으로 좋지 않을지라도, 기본 예외와 관련된 메시지를 검사하고 메시지가 예상과 일치하는 경우 내부 예외를 포함시키지 않는 것이 도움이 될 수 있습니다. 이러한 사용은 코드가 Single 메서드의 변경과 관련하여 다소 취약해질 수 있지만 단일 메서드가 예상되는 메시지와 함께 예외를 throw하는 경우와 무언가가 InvalidOperationException 인 경우에 더 나은 동작을 제공합니다. 예기치 않은 이유. 이 두 가지 "승"은 Single의 변경으로 인해 예상 시나리오로 간주되어야하는 내부 예외를 포함하여 코드가 불필요하게 시작될 수 있다는 사실을 극복하기에 충분할 수 있습니다.

관련 문제