вторник, 22 октября 2019 г.

Exception.Message

понадобилось понять, как формируется текстовое представление Exception, что к чему относится.
написал проверочную программку - см. ниже.


резюме: сначала идет последовательно тип и Message по каждому из цепочки исключений, начиная с самого внешнего.

потом - стек вызовов для каждого исключения, начиная с самого внутреннего. при чем, стек заканчивается на той строке, которая обернута в try/catch, поймавший данное исключение, если только оно не было кинуто дальше.
если же было кинуто дальше - факт поимки никак не отражается.

стектрейс отсчитывается от оператора throw, а не от места, где исключение создано

код программы:

  1. using System;
  2. namespace ConsoleApp1
  3. {
  4.    
  5.     class Program
  6.     {
  7.         static void f4()
  8.         {
  9.             throw new Exception("!!!");
  10.         }
  11.        
  12.         static void f3()
  13.         {
  14.             try
  15.             {
  16.                 f4();
  17.             }
  18.             catch(Exception e)
  19.             {
  20.                 throw new Exception("f3catch", e);
  21.             }
  22.         }
  23.         static void f2()
  24.         {
  25.             f3();
  26.         }
  27.         static void f1()
  28.         {
  29.             try
  30.             {
  31.                 f2();
  32.             }
  33.             catch (Exception e)
  34.             {
  35.                 throw new Exception("f1catch", e);
  36.             }
  37.            
  38.         }
  39.         static void f0()
  40.         {
  41.             try
  42.             {
  43.                 f1();
  44.             }
  45.             catch (Exception e)
  46.             {
  47.                 Console.WriteLine("Exception caught: " e.Message);
  48.                 throw;
  49.             }
  50.         }
  51.         static void f_minus1()
  52.         {
  53.             try
  54.             {
  55.                 f0();
  56.             }
  57.             catch (Exception e)
  58.             {
  59.                 ExceptionThrower(new Exception("via thrower", e));
  60.             }
  61.         }
  62.         private static void ExceptionThrower(Exception e)
  63.         {
  64.             throw e;
  65.         }
  66.         public static void Main()
  67.         {
  68.             try
  69.             {
  70.                 f_minus1();
  71.             }catch(Exception e)
  72.             {
  73.                 Console.WriteLine(e);
  74.             }
  75.             Console.WriteLine("DONE");
  76.             Console.ReadKey();
  77.         }
  78.        
  79.     }
  80. }

аутпут:
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