Я заметил странное поведение с номером строки в трассе стека исключений, если исключение выбрано внутри оператора switch
.
Вот пример (вопросы форматирования, конечно, из-за номеров строк):
using System;
class Program {
static void Main(string[] args) {
for (int i = 0; i < 3; i++) {
try {
ThrowSomeException(i);
} catch (Exception exc) {
Console.WriteLine(exc);
}
}
}
private static void ThrowSomeException(int arg) {
Console.WriteLine("arg = {0}", arg);
switch (arg) {
case 0:
throw new Exception("Line number = 16");
case 1:
throw new Exception("Line number = 18");
default:
throw new Exception("Line number = 20");
}
}
}
Строка, указанная в трассировке стека, представляет собой строку исключения next в инструкции switch. Вышеупомянутая программа производит этот результат (обратите внимание на несоответствие номера строки в тексте исключения и номер строки в трассировке стека):
arg = 0
System.Exception: Line number = 16
at Program.ThrowSomeException(Int32 arg) in x:\test\Program.cs:line 18
at Program.Main(String[] args) in x:\test\Program.cs:line 6
arg = 1
System.Exception: Line number = 18
at Program.ThrowSomeException(Int32 arg) in x:\test\Program.cs:line 20
at Program.Main(String[] args) in x:\test\Program.cs:line 6
arg = 2
System.Exception: Line number = 20
at Program.ThrowSomeException(Int32 arg) in x:\test\Program.cs:line 20
at Program.Main(String[] args) in x:\test\Program.cs:line 6
Почему это происходит?
Примечание. Я пробовал это как с VS 2012, так и с 2013 года, компилируя оба из .NET 3.5 и 4.5 и получив те же результаты.
Debug vs Release: на удивление, я получаю это странное поведение только в Debug, в Release номера строк верны.