重複の可能性:
再スローによる不適切なスタックトレース
一般に、.NETthrow;
ではスタック トレースはリセットされませんが、リセットされることが認められてthrow ex;
います。
ただし、この単純なプログラムでは、異なる行番号を取得します。
void Main()
{
try
{
try
{
Wrapper(); // line 13
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
throw; // line 18
}
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
}
public void Wrapper()
{
Throw(); // line 28
}
public void Throw()
{
var x = (string)(object)1; // line 33
}
出力は次のとおりです。
System.InvalidCastException: タイプ 'System.Int32' のオブジェクトをタイプ 'System.String' にキャストできません。C:\long-path\Program.cs:line 13 の ConsoleApplication2.Program.Main(String[] args) で
System.InvalidCastException: タイプ 'System.Int32' のオブジェクトをタイプ 'System.String' にキャストできません。C:\long-path\Program.cs:line 18 の ConsoleApplication2.Program.Main(String[] args) で
注: 最初のスタック トレースには 13 行目が含まれ、2 つ目のスタック トレースには 18 行目が含まれます。さらに、13 行目も 18 行目も実際にキャストが行われる行ではありません。
私の質問は次のとおりです。どのような状況でスタック トレースが変更され、どの状況throw;
でスタック トレースが変更されないのでしょうか。
これはすでに観察されていますが、一般的には回答されていないことに注意してください。
更新:
上記のコードをデバッグ モードで実行したところ、次の結果が得られました。
System.InvalidCastException: タイプ 'System.Int32' のオブジェクトをタイプ 'System.String' にキャストできません。C:\long-path\Program.cs:line 33 の ConsoleApplication2.Program.Throw() C:\long-path\Program.cs:Line 28 の ConsoleApplication2.Program.Wrapper() ConsoleApplication2.Program.Main (String[] args) in C:\long-path\Program.cs:line 13
System.InvalidCastException: タイプ 'System.Int32' のオブジェクトをタイプ 'System.String' にキャストできません。C:\long-path\Program.cs:line 33 の ConsoleApplication2.Program.Throw() C:\long-path\Program.cs:Line 28 の ConsoleApplication2.Program.Wrapper() ConsoleApplication2.Program.Main (String[] args) in C:\long-path\Program.cs:line 18
注意: 最後の行番号はまだ変更されています