Ранее здесь обсуждался вопрос о правильном способе отбрасывания исключения. Вместо этого этот вопрос о том, как получить полезное поведение от 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 Call Stack показывает только Main, тогда как я ожидал, что оно покажет стек вызовов исключения, вплоть до foo.
Когда нет переброса, я могу использовать графический интерфейс для очень быстрой навигации по стеку вызовов, чтобы увидеть, какой вызов вызвал исключение и как мы туда попали.
С повторным броском я бы хотел сделать то же самое. Вместо этого стек вызовов, который показывает GUI, бесполезен для меня. Я должен скопировать информацию об исключении в буфер обмена, вставить его в Блокнот, а затем вручную перейти к любой интересующей меня функции стека вызовов.
Кстати, я получаю такое же поведение, если добавляю [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
или меняю улов на просто catch (Exception)
.
У меня такой вопрос: учитывая, что код, который я использую, использует rethrow, может кто-нибудь предложить удобный способ навигации по стеку вызовов, связанному с исключением? Я использую Visual Studio 2010.