Здесь обсуждались правильные пути восстановления исключения. Вместо этого возникает вопрос о том, как получить полезное поведение из Visual Studio при использовании метода rethrow.
Рассмотрим этот код:
static void foo() {
throw new Exception("boo!");
}
static void Main(string[] args) {
try {
foo();
} catch (Exception x) {
// do some stuff
throw;
}
}
Исключительное исключение имеет правильную трассировку стека, отображающую foo() как источник исключения. Тем не менее, окно "Стек вызовов GUI" показывает только Main, тогда как я ожидал, что он покажет стек вызовов исключений, вплоть до foo.
Когда нет повтора, я могу использовать графический интерфейс, чтобы очень быстро перейти в стек вызовов, чтобы узнать, какой вызов вызвал исключение и как мы туда попали.
С ретровом я хотел бы сделать то же самое. Вместо этого стек вызовов, отображаемый графическим интерфейсом, бесполезен для меня. Мне нужно скопировать данные об исключениях в буфер обмена, вставить их в Блокнот, а затем вручную перейти к какой бы функции стека вызовов я не интересовал.
Кстати, я получаю такое же поведение, если добавляю [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
, или если я изменю catch на просто catch (Exception)
.
Мой вопрос: учитывая, что в коде, который я использую rethrow, может кто-нибудь предложить удобный способ навигации по стеку вызовов, связанному с исключением? Я использую Visual Studio 2010.