>백엔드 개발 >C++ >C#에서 예외를 다시 발생시킬 때 스택 추적을 어떻게 보존할 수 있습니까?

C#에서 예외를 다시 발생시킬 때 스택 추적을 어떻게 보존할 수 있습니까?

DDD
DDD원래의
2025-01-17 07:06:09187검색

How Can I Preserve Stack Traces When Rethrowing Exceptions in C#?

C#에서 내부 예외를 다시 발생시킬 때 스택 추적 유지

기본 예외를 호출자에게 전달하기 위해 InnerException을 다시 발생시키는 것이 일반적인 관행이지만, 이로 인해 중요한 스택 추적 정보가 실수로 삭제되어 디버깅 작업이 방해를 받을 수 있습니다.

C#에서는 리플렉션을 통해 메서드가 호출되고 예외가 발생하면 실제 예외 주위에 래퍼로 ​​TargetInvocationException이 발생합니다. 내부 예외를 검색하기 위해 개발자는 종종 해당 예외를 다시 발생시킵니다. 그러나 이 작업을 수행하면 오류의 실제 원인을 가리키는 스택 추적 정보가 지워집니다.

ExceptionDispatchInfo를 사용한 솔루션

.NET 4.5부터는 ExceptionDispatchInfo 클래스가 이 문제에 대한 솔루션을 제공합니다. 스택 추적을 유지하면서 예외를 포착하고 다시 발생시킬 수 있습니다. 사용 방법은 다음과 같습니다.

<code class="language-csharp">using ExceptionDispatchInfo = 
    System.Runtime.ExceptionServices.ExceptionDispatchInfo;

try
{
    // 执行可能抛出异常的方法。
    task.Wait();
}
catch (AggregateException ex)
{
    // 捕获内部异常并使用原始堆栈跟踪重新抛出它。
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}</code>

이 메서드는 C# 언어 기능을 사용한 후 AggregateException 인스턴스에서 내부 예외를 래핑 해제할 때 특히 유용합니다. 비동기 프로그래밍 중에 스택 추적 정보가 손실되지 않도록 보장합니다.

위 내용은 C#에서 예외를 다시 발생시킬 때 스택 추적을 어떻게 보존할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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