Я подтвердил это же поведение в VS2005, поэтому я ошибся называть его ошибкой .NET (1.1).Отображение трассировки стека исключений, которые были повторно выбраны, а не трассировки стека из точки бросания
Я оставляю исходный вопрос ниже, но мой пересмотренный вопрос таков: как мне получить Visual Studio, чтобы дать мне трассировку стека исключения, которое я поймал, и повторно выбрал в окне окна вызова , а не только отображать стек вызовов из точки оператора throw
?
Ситуация такова, что я решаю во время выполнения является ли глобальный обработчик исключений или выключен - если он выключен, я хочу VS, чтобы поймать исключение, так что я могу пройти через стек вызовов, чтобы выяснить, что пошло неправильно.
Ранее глобальный обработчик исключений либо был скомпилирован в программу, либо нет. Но ситуация изменилась, и теперь мы должны решить, во время выполнения - это выглядит, как я, возможно, придется вернуться к макро способ сделать это, но без макросов:
if (allow_bubble_up)
{
Foo();
}
else
{
try
{
Foo();
}
catch (Exception e)
{
GlobalExceptionHandler(e);
}
}
Но этот подход чувствует чрезвычайно против СУХОЙ, мне.
Видимо есть ошибка в .NET 1.1, где, если у вас есть пустой throw
заявление повторно бросить пойманной исключение, трассировки стека начинается от того, где что throw
произошло, вместо трассировки стека из все исключение было переброшено - по крайней мере, я видел, что это вызвало ошибку в нескольких блогах, но я не смог получить гораздо больше информации об этом.
Чтобы быть более конкретным, свойство StackTrace
$exception
в QuickWatch показывает правильные данные, но окно вызова стека в VS показывает только стек вызовов до уровня оператора throw.
В этом примере кода я могу видеть только 1-уровень-глубокий трассировку стека Main
, хотя я должен увидеть трассировки стека пары вызовов Foo
.
static public void Foo(int i)
{
if (i > 4)
{
throw new ArgumentOutOfRangeException();
}
Foo(i + 1);
}
static void Main(string[] args)
{
bool allow_bubble_up = true;
try
{
Foo(0);
}
catch (Exception e)
{
if (allow_bubble_up)
{
// stack trace just shows Main
throw;
// also just shows Main
//throw new Exception("asdf", e);
// STILL just shows Main
//throw e;
}
else
{
System.Console.WriteLine(e);
}
}
}
Fabrice Marguerie's blog показывает, как работать вокруг повторно брошен стек следов какого-то для .NET 2.0+, и в нижней части он говорит, чтобы проверить блог Криса Тейлора о том, как сделать это в .NET 1.1. Мне пришлось искать немного до find it on archive.org. I думаю Я реализовал его правильно, но у меня все еще есть трассировка стека только на главном - его объяснение было не очень ясным, и я бы предпочел не связываться с базой кода (обернуть существующий набор функций другим способом) не более, чем необходимо.
Я вижу правильную трассировку стека в свойствах пойманного и повторно поднятого исключения, но трассируемая трассировка стека, которую показывает VS, бесполезна, поскольку она отслеживает только из инструкции throw
. Если я никогда не поймаю и не переброшу исключение, я получаю полную и правильную трассировку стека, do.
Как получить правильную трассировку стека, отображаемую в VS? Я надеюсь, что есть какой-то простой способ обхода проблемы, и что я только что искал неправильные условия.
И, к сожалению, для этого должен быть VS2003 + C#.
Если бы не было иначе ясно, вот скриншот (вам, вероятно, нужно щелкнуть правой кнопкой мыши и просмотра изображений):
alt text http://img257.imageshack.us/img257/1124/40727627.png
Я помню, что это очень расстраивало 1.1. Никогда не искал решения в то время, но ты не сумасшедший. Я знаю, что Вы имеете ввиду! Но не так сильно разочаровывающе, как я предполагаю, что все еще использовать 1.1 может быть! –
Это выглядит правильно, так как Main является вызывающим фактором Foo, который в итоге выбрал исключение. – user7116
@Mark Rushakoff: Я выделил точку окна «Стек вызовов», которая была самой большой точкой смятения. – user7116