А конкретно про оператор throw и одну особенность его вызова в блоке catch о которой не все знают и даже в MSDN о ней написано чуть более чем ничего. Вот цитата:
The throw statement can be used without an argument, but only if the throw statement is contained within a catch block. In that situation, the throw statement re-throws the error caught by the enclosing catch statement. When an argument is provided, the throw statement throws the value of exception.
На самом деле, основная разница в вызове throw с аргументом и без - в сохранении стека вызова.
Проиллюстрировать эту разницу можно вот такой простой программкой:
static void Main(string[] args)
{
try {
OpenFile1("C:\\test.txt");
}
catch (Exception e)
{
Console.WriteLine("Exception with throw e;"+Environment.NewLine);
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
Console.WriteLine();
Console.WriteLine();
try
{
OpenFile2("C:\\test.txt");
}
catch (Exception e)
{
Console.WriteLine("Exception with throw;" + Environment.NewLine);
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
Console.ReadLine();
}
//используем throw c аргументом.
private static void OpenFile1(string filename)
{
try
{
StreamReader sr = new StreamReader(filename);
}
catch (Exception e)
{
throw e;
}
}
//используем throw без аргумента
private static void OpenFile2(string filename)
{
try
{
StreamReader sr = new StreamReader(filename);
}
catch
{
throw;
}
}
Два метода, пытающиеся отрыть файл, которого у меня нет, абсолютно идентичны за исключением способа вызова throw в случае возникновения ошибки и выбрасывания исключения в процессе открытия файла. Ну и, естественно, содержимого свойства .StackTrace в итоге. Вот результат выполнения этой программы:

Комментариев нет:
Отправить комментарий