다른 대답은 전적으로 정확하지만이 대답은 약간의 추가 detalis를 제공한다고 생각합니다.
이 예제를 고려하십시오.
using System;
static class Program {
static void Main() {
try {
ThrowTest();
} catch (Exception e) {
Console.WriteLine("Your stack trace:");
Console.WriteLine(e.StackTrace);
Console.WriteLine();
if (e.InnerException == null) {
Console.WriteLine("No inner exception.");
} else {
Console.WriteLine("Stack trace of your inner exception:");
Console.WriteLine(e.InnerException.StackTrace);
}
}
}
static void ThrowTest() {
decimal a = 1m;
decimal b = 0m;
try {
Mult(a, b); // line 34
Div(a, b); // line 35
Mult(b, a); // line 36
Div(b, a); // line 37
} catch (ArithmeticException arithExc) {
Console.WriteLine("Handling a {0}.", arithExc.GetType().Name);
// uncomment EITHER
//throw arithExc;
// OR
//throw;
// OR
//throw new Exception("We handled and wrapped your exception", arithExc);
}
}
static void Mult(decimal x, decimal y) {
decimal.Multiply(x, y);
}
static void Div(decimal x, decimal y) {
decimal.Divide(x, y);
}
}
throw arithExc;
줄의 주석을 해제하면 출력은 다음과 같습니다.
Handling a DivideByZeroException.
Your stack trace:
at Program.ThrowTest() in c:\somepath\Program.cs:line 44
at Program.Main() in c:\somepath\Program.cs:line 9
No inner exception.
확실히, 예외가 발생한 위치에 대한 정보를 잃어 버렸습니다. 대신 throw;
라인 을 사용하면 다음 과 같은 결과를 얻습니다.
Handling a DivideByZeroException.
Your stack trace:
at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Program.Div(Decimal x, Decimal y) in c:\somepath\Program.cs:line 58
at Program.ThrowTest() in c:\somepath\Program.cs:line 46
at Program.Main() in c:\somepath\Program.cs:line 9
No inner exception.
이것은 Program.Div
문제를 일으키는 방법이라는 것을 알기 때문에 훨씬 좋습니다 . 그러나이 문제가 try
블록의 35 번째 줄 또는 37 번째 줄에서 오는지 여전히 확인하기 어렵습니다 .
외부 예외로 래핑하는 세 번째 대안을 사용하면 정보가 손실되지 않습니다.
Handling a DivideByZeroException.
Your stack trace:
at Program.ThrowTest() in c:\somepath\Program.cs:line 48
at Program.Main() in c:\somepath\Program.cs:line 9
Stack trace of your inner exception:
at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Program.Div(Decimal x, Decimal y) in c:\somepath\Program.cs:line 58
at Program.ThrowTest() in c:\somepath\Program.cs:line 35
특히 문제를 일으키는 35 번째 줄임을 알 수 있습니다. 그러나 이것은 사람들이를 검색해야 InnerException
하며 간단한 경우에는 내부 예외를 사용하는 것이 다소 간접적이라고 생각합니다.
에서 이 블로그 게시물 그들은 (반사를 통해)를 호출하여 행 번호 (try 블록의 라인을) 보존 internal
intance 방법 InternalPreserveStackTrace()
상의 Exception
객체를. 그러나 리플렉션을 사용하는 것은 좋지 않습니다 (.NET Framework는 internal
언젠가 경고없이 멤버를 변경할 수 있습니다 ).