>백엔드 개발 >C++ >C#에서 예외를 올바르게 다시 발생시키고 스택 추적을 유지하는 방법은 무엇입니까?

C#에서 예외를 올바르게 다시 발생시키고 스택 추적을 유지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-23 19:01:08473검색

How to Properly Rethrow Exceptions in C# and Preserve the Stack Trace?

C#의 올바른 예외 재발견 방법

C#에서 예외를 처리할 때 올바른 rethrow 구문은 스택 추적의 정확성을 보장하는 데 중요합니다. 일부 다시 던지기 기술은 유사해 보이지만 미묘한 차이가 디버깅 프로세스에 영향을 미칠 수 있습니다.

방법 1:

<code class="language-csharp">try
{
    // ...代码块...
}
catch (Exception ex)
{
    // ...处理代码...
    throw;
}</code>

이 메서드는 수정 없이 단순히 발견된 예외를 다시 발생시킵니다. 일반적으로 이 방법은 원래 스택 추적을 유지하여 개발자가 소스에 대한 예외를 정확하게 추적할 수 있도록 하기 때문에 두 번째 방법보다 선호됩니다.

방법 2:

<code class="language-csharp">try
{
    // ...代码块...
}
catch (Exception ex)
{
    // ...处理代码...
    throw ex;
}</code>

이 방법은 예외를 다시 발생시키기도 하지만 스택 추적을 변경할 수 있습니다. 포착된 예외를 명시적으로 발생시키면 새로운 스택 프레임이 생성되어 예외의 원래 소스가 모호해지고 근본 원인을 찾아내기가 더 어려워집니다.

다른 소스에서 예외를 다시 발생시키려면 ExceptionDispatchInfo를 사용하세요.

다른 컨텍스트(예: 집계 예외 또는 별도 스레드)에서 예외를 다시 발생시켜야 하는 경우 ExceptionDispatchInfo 클래스를 사용해야 합니다. 이 클래스는 원래 예외의 필수 정보를 캡처하고 원래 스택 추적을 유지하면서 새 컨텍스트에서 다시 발생하도록 허용합니다.

예:

<code class="language-csharp">try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // 告知编译器代码流不会离开此代码块
}</code>

ExceptionDispatchInfo 클래스를 사용하면 원래 예외의 컨텍스트와 스택 추적이 보존되므로 개발자는 오류의 소스를 정확하게 추적할 수 있습니다.

위 내용은 C#에서 예외를 올바르게 다시 발생시키고 스택 추적을 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.