понадобилось понять, как формируется текстовое представление Exception, что к чему относится.
написал проверочную программку - см. ниже.
резюме: сначала идет последовательно тип и Message по каждому из цепочки исключений, начиная с самого внешнего.
потом - стек вызовов для каждого исключения, начиная с самого внутреннего. при чем, стек заканчивается на той строке, которая обернута в try/catch, поймавший данное исключение, если только оно не было кинуто дальше.
если же было кинуто дальше - факт поимки никак не отражается.
стектрейс отсчитывается от оператора throw, а не от места, где исключение создано
код программы:
аутпут:
написал проверочную программку - см. ниже.
резюме: сначала идет последовательно тип и Message по каждому из цепочки исключений, начиная с самого внешнего.
потом - стек вызовов для каждого исключения, начиная с самого внутреннего. при чем, стек заканчивается на той строке, которая обернута в try/catch, поймавший данное исключение, если только оно не было кинуто дальше.
если же было кинуто дальше - факт поимки никак не отражается.
стектрейс отсчитывается от оператора throw, а не от места, где исключение создано
код программы:
- using System;
- namespace ConsoleApp1
- {
- class Program
- {
- static void f4()
- {
- }
- static void f3()
- {
- try
- {
- f4();
- }
- catch(Exception e)
- {
- }
- }
- static void f2()
- {
- f3();
- }
- static void f1()
- {
- try
- {
- f2();
- }
- catch (Exception e)
- {
- }
- }
- static void f0()
- {
- try
- {
- f1();
- }
- catch (Exception e)
- {
- Console.WriteLine("Exception caught: " e.Message);
- throw;
- }
- }
- static void f_minus1()
- {
- try
- {
- f0();
- }
- catch (Exception e)
- {
- }
- }
- private static void ExceptionThrower(Exception e)
- {
- throw e;
- }
- public static void Main()
- {
- try
- {
- f_minus1();
- }catch(Exception e)
- {
- Console.WriteLine(e);
- }
- Console.WriteLine("DONE");
- Console.ReadKey();
- }
- }
- }
аутпут:
Exception caught: f1catch
System.Exception: via thrower ---> System.Exception: f1catch ---> System.Exception: f3catch ---> System.Exception: !!!
в ConsoleApp1.Program.f4() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 11
в ConsoleApp1.Program.f3() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 18
--- Конец трассировки внутреннего стека исключений ---
в ConsoleApp1.Program.f3() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 22
в ConsoleApp1.Program.f2() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 28
в ConsoleApp1.Program.f1() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 35
--- Конец трассировки внутреннего стека исключений ---
в ConsoleApp1.Program.f1() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 39
в ConsoleApp1.Program.f0() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 53
в ConsoleApp1.Program.f_minus1() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 61
--- Конец трассировки внутреннего стека исключений ---
в ConsoleApp1.Program.ExceptionThrower(Exception e) в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 71
в ConsoleApp1.Program.f_minus1() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 65
в ConsoleApp1.Program.Main() в C:\TestProjects\ConsoleApp1\ConsoleApp1\Program.cs:строка 79
DONE