[C#] throw와 throw new Exception ()의 차이점

차이점은 무엇입니까

try { ... }
catch{ throw } 

try{ ... }
catch(Exception e) {throw new Exception(e.message) } 

두 번째 메시지에 상관없이?



답변

throw; 원래 예외를 다시 발생시키고 원래 스택 추적을 유지합니다.

throw ex;원래 예외를 throw하지만 스택 추적을 재설정하여 catch블록 까지 모든 스택 추적 정보를 삭제합니다 .

절대 쓰지 마throw ex;

throw new Exception(ex.Message);더 나빠요 Exception예외의 원래 스택 추적과 유형을 잃어 버린 새로운 인스턴스를 만듭니다 . (예 🙂 IOException.
또한 일부 예외에는 추가 정보 (예 :)가 ArgumentException.ParamName있습니다.
throw new Exception(ex.Message); 이 정보도 파괴됩니다.

경우에 따라 예외가 발생했을 때 코드가 수행 한 작업에 대한 추가 정보를 제공 할 수 있도록 모든 예외를 사용자 정의 예외 오브젝트로 랩핑 할 수 있습니다.

이렇게하려면 상속을하는 새로운 클래스를 정의 Exception, 네 예외 생성자를 추가 및 소요 선택적으로 추가 생성자 InnerException추가 정보뿐만 아니라,하고, 새로운 예외 클래스를 던져 통과 ex는 AS InnerException매개 변수 . original를 전달하면 InnerException스택 추적을 포함하여 모든 원래 예외 속성이 유지됩니다.


답변

첫 번째는 원래 스택 추적을 유지합니다.

try { ... }
catch
{
    // Do something.
    throw;
}

두 번째는 예외 유형 및 / 또는 메시지 및 기타 데이터를 변경할 수 있습니다.

try { ... } catch (Exception e)
{
    throw new BarException("Something broke!");
}

내부 예외를 전달하는 세 번째 방법도 있습니다.

try { ... }
catch (FooException e) {
    throw new BarException("foo", e);
} 

다음을 사용하는 것이 좋습니다.

  • 첫 번째는 정보를 파괴하거나 오류에 대한 정보를 추가하지 않고 오류 상황에서 일부 정리를 수행하려는 경우입니다.
  • 세 번째는 오류에 대한 추가 정보를 추가하려는 경우입니다.
  • 두 번째는 신뢰할 수없는 사용자로부터 정보를 숨기려는 경우입니다.

답변

다른 사람이 보지 못한 한 가지 다른 점은 다음과 같습니다.

catch {} 블록에서 아무 것도하지 않으면 try … catch를 갖는 것은 의미가 없습니다. 나는 항상 이것을 본다 :

try 
{
  //Code here
}
catch
{
    throw;
}

또는 더 나쁜 :

try 
{
  //Code here
}
catch(Exception ex)
{
    throw ex;
}

최악의 경우 :

try 
{
  //Code here
}
catch(Exception ex)
{
    throw new System.Exception(ex.Message);
}


답변

throw발견 된 예외 throw new Exception의 세부 사항 중 일부 를 잃으면 서 스택 추적을 유지하면서 발견 된 예외를 다시 발생시킵니다.

일반적으로 throw그 시점에서 예외를 완전히 처리하지 않고 자체적으로 예외를 기록합니다.

BlackWasp에는 C #에서 Throwing Exceptions 라는 제목의 기사가 있습니다.


답변

새로운 예외를 던지면 현재 스택 추적이 사라집니다.

throw;원래 스택 추적을 유지하며 거의 항상 더 유용합니다. 해당 규칙의 예외는 사용자 정의 예외에서 예외를 래핑하려는 경우입니다. 그런 다음 수행해야합니다.

catch(Exception e)
{
    throw new CustomException(customMessage, e);
}


답변

throw발견 된 예외를 다시 발생시키기위한 것입니다. 이는 호출 체인을 전달하기 전에 예외로 무언가를 수행하려는 경우 유용 할 수 있습니다.

throw인수없이 사용하면 디버깅 목적으로 호출 스택이 유지됩니다.


답변

원하는 경우 원래 예외를 내부 예외로 설정하여 새 예외를 throw 할 수 있습니다.