Исключение броска

В С# будет ли следующий код throw e содержать дополнительную информацию в стеке вызовов?

...
catch(Exception e)
{
  e.Data.Add("Additional information","blah blah");
  throw;
}

Ответ 1

Да, будет. Многие разработчики не понимают, что следующий код будет генерировать новое исключение из этой точки в стеке вызовов, а не вызовы, сделанные ранее в стеке перед catch.

...
catch(Exception e)
{
  e.Data.Add("Additional information","blah blah");
  throw e;
}

Я усвоил этот трудный путь!

Ответ 2

        var answer = "No";
        try
        {
            try
            {
                throw new Exception();
            }
            catch (Exception e)
            {
                e.Data.Add("mykey", "myvalue");
                throw;
            }
        }
        catch (Exception e)
        {
            if((string)e.Data["mykey"] == "myvalue")
                answer = "Yes";
        }

        Console.WriteLine(answer);
        Console.ReadLine();     

При запуске кода вы обнаружите, что ответ "да": -)

Ответ 3

Исключения не являются неизменными, и возможность добавлять к ним информацию является одной из причин этого.

Итак, да, данные будут добавлены в информацию об исключении, которая будет активирована.

Ответ 4

Вы можете это сделать, но из-за FxCop я всегда создавал пользовательские исключения, когда я бросаю и исключаю. Это дает вызывающей способности возможность легко поймать и понять различные типы ошибок. Если вам нужно включить последующее исключение, вы можете использовать InnerException of Exception или просто объявить переменную-член для нового Exception.

Это говорит вам, как сделать вас успешными. http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

Это одна из тех программ, которые люди любят пропускать, потому что это просто дополнительная работа, чтобы получить функциональность приложения.

Это страница моего личного Zen программирования:

Ваша программа - ваш дом. Сделайте так же хорошо, как вы можете, поэтому легко и весело жить.