.NET에서 예외를 잘못 throw하면 스택 추적이 지워질 수 있습니다.
다음과 같이 예외를 포착하고 다시 throw하는 경우 스택 추적의 일부를 지우는 것입니다.
try
{
DoWork();
}
catch (Exception ex)
{
throw ex;
}
다시 throw된 예외를 catch하고 스택 추적을 인쇄하면 예외가 원래 throw된
DoWork
메서드에 대한 언급이 없음을 알 수 있습니다.System.Exception: Exception of type 'System.Exception' was thrown.
at CatchRethrow.Program.IncorrectCatchAndReThrow() in /home/azureuser/CatchRethrow/Program.cs:line 50
at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 22
예외가 다시 발생했을 때 덮어 쓰기 때문입니다.
올바른 구문은
throw;
대신 throw ex;
를 사용하는 것입니다.try
{
DoWork();
}
catch (Exception ex)
{
throw;
}
지금 다시 발생한 예외를 catch하고 스택 추적을 인쇄하면
DoWork
메서드가 스택 추적의 일부로 인쇄됩니다.System.Exception: Exception of type 'System.Exception' was thrown.
at CatchRethrow.Program.DoWork() in /home/azureuser/CatchRethrow/Program.cs:line 56
at CatchRethrow.Program.CorrectCatchAndThrow() in /home/azureuser/CatchRethrow/Program.cs:line 34
at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 12
운 좋게도 이에 대해 경고하는 코드 분석 규칙 "CA2200: Rethrow to preserve stack details "이 있습니다.
다음은 위의 문제를 설명하는 데 사용된 전체 코드 샘플입니다.
using System;
class Program
{
static void Main(string[] args)
{
// correct catch/throw
try
{
CorrectCatchAndThrow();
}
catch (Exception ex)
{
Console.WriteLine(ex);
/*
System.Exception: Exception of type 'System.Exception' was thrown.
at CatchRethrow.Program.DoWork() in /home/azureuser/CatchRethrow/Program.cs:line 56
at CatchRethrow.Program.CorrectCatchAndThrow() in /home/azureuser/CatchRethrow/Program.cs:line 34
at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 12
*/
}
// incorrect catch/throw
try
{
IncorrectCatchAndReThrow();
}
catch (Exception ex)
{
Console.WriteLine(ex);
/*
System.Exception: Exception of type 'System.Exception' was thrown.
at CatchRethrow.Program.IncorrectCatchAndReThrow() in /home/azureuser/CatchRethrow/Program.cs:line 50
at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 22
*/
}
}
static void CorrectCatchAndThrow()
{
try
{
DoWork();
}
catch (Exception ex)
{
throw;
}
}
static void IncorrectCatchAndReThrow()
{
try
{
DoWork();
}
catch (Exception ex)
{
throw ex;
}
}
static void DoWork()
{
throw new Exception();
}
}
Reference
이 문제에 관하여(.NET에서 예외를 잘못 throw하면 스택 추적이 지워질 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/swimburger/rethrowing-your-exceptions-wrong-in-net-could-erase-your-stacktrace-545j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)