2013-09-18 4 views
-1

Я пытаюсь поймать исключение, добавить к нему информацию и выбросить новое (расширенное) исключение для вызывающего модуля.бросать новые исключения в catch()

Пример:

void CallingMethod() 
    { 
     try 
     { 
      doStuff(); 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    void doStuff() 
    { 
     try 
     { 
      // do something here that may throw an error 
     } 
     catch(Exception e) 
     { 
      Exception e2 = new Exception("new added info", e); 
      throw e2; 
     } 
     finally() 
     { 
      // cleanup 
     } 
    } 

но когда ошибка происходит и записывается в консоль, это оригинальная ошибка не моя новая ошибка, содержащая строку «новый добавлена ​​информация».

Ожидается ли это? Как мне отправить ошибка, которую нужно поймать?

+5

Невозможно воспроизвести это. Кажется, это новое исключение с оригинальным как внутреннее исключение. –

+1

Я скопировал ваш код, и «новая информация добавлена» - это первое, что выводится на консоль. – McGarnagle

+0

Что такое оригинальное исключение? –

ответ

2

Рассмотрим эту программу:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication20 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     DoSomething() ; 
     return ; 
    } 
    static void DoSomething() 
    { 
     try 
     { 
     DoSomethingThatFails() ; 
     } 
     catch(Exception e) 
     { 
     throw new InvalidOperationException("This is the wrapper exception" , e) ; 
     } 
    } 
    static int DoSomethingThatFails() 
    { 
     int x = 3 ; 
     int y = 0 ; 
     int z = x/y ; // can you say "divide by zero"? 
     return z ; 
    } 
    } 
} 

Это то, что будет записано в консоли:

Unhandled Exception: System.InvalidOperationException: This is the wrapper exception ---> System.DivideByZeroException: Attempted to divide by zero. 
    at ConsoleApplication20.Program.DoSomethingThatFails() in ...\Program.cs:line 32 
    at ConsoleApplication20.Program.DoSomething() in ...\Program.cs:line 21 
    --- End of inner exception stack trace --- 
    at ConsoleApplication20.Program.DoSomething() in ...\Program.cs:line 25 
    at ConsoleApplication20.Program.Main(String[] args) in ...\Program.cs:line 14 

Вы заметите, первая строка состоит из внешнего исключения и его сообщения (InvalidOperationException и This is the wrapper exception), затем стрелка (--->), за которой следует внутреннее исключение (DivideByZeroException и Attempted to divide by zero.).

Следующие две строки - это трассировка стека внутренняя ошибка, за которой следует маркер, указывающий конец трассировки стека внутреннего исключения. Затем вы получаете трассировку стека для исключения внешнего.

Вся информация есть, вы просто не видите ее.

+0

моя ситуация была на самом деле не такой, как вы ожидали отсюда (см. Мой комментарий к вопросу - у меня была другая ошибка, возникающая в finally()), но этот ответ мог быть причиной, поэтому я принял его, спасибо – mcmillab

Смежные вопросы