English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В предыдущем разделе мы уже рассмотрели, как обрабатывать исключения, автоматически引发的 CLR. Здесь мы увидим, как можно вручную вызывать исключения.
可以使用 throw ключевое слово вручную вызывать исключения. Использование throw ключевое слово можно вызывать отExceptionлюбого типа, производящегося от класса Exception.
static void Main(string[] args) { Student std = null; пробовать { PrintStudentName(std); } catch(Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); } private static void PrintStudentName(Student std) { if (std == null) выбросить new NullReferenceException("Объект Student равен null"); Console.WriteLine(std.StudentName); }
Объект Student равен null
В предыдущем примере, если объект Student равен null, метод PrintStudentName() выбрасывает NullReferenceException.
Обратите внимание, что throw с ключевым словом new создает объект любого эффективного типа исключения. Ключевое слово throw не может использоваться с любым типом, не происходящим от класса Exception.
Вы также можете повторно вызывать исключение из блока catch, чтобы передать его вызовщику и позволить ему обрабатывать его в所需要的 способ.
static void Main(string[] args) { пробовать { Method1(); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); } } static void Method1() { пробовать { Method2(); } catch(Exception ex) { throw; } } static void Method2() { string str = null; пробовать { Console.WriteLine(str[0]); } catch(Exception ex) { throw; } }
В предыдущем примере исключение возникает в Method2(). Блок catch использует только ключевое слово throw (а не throw e), чтобы引发 это исключение. Это будет обработано в блоке catch в Method1(), где оно снова выбрасывается, и в конце концов обработано в методе Main(). Стек трассировки исключения предоставит точное местоположение и полные详细信息 об этом исключении.
Если использовать параметры исключения для повторного выброса исключения, то оно не сохранит исходное исключение и создаст новое исключение. Ниже приведен пример, демонстрирующий это.
static void Main(string[] args) { пробовать { Method1(); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); } } static void Method1() { пробовать { Method2(); } catch(Exception ex) { выбросить ex; } } static void Method2() { string str = null; пробовать { Console.WriteLine(str[0]); } catch(Exception ex) { throw; } }
В примере выше, исключение, захваченное в методе Main (), покажет отладочную информацию от методов Method1 и Main. Когда мы используем throw ex для повторного выброса исключения в Method1 (), оно не будет отображаться в отладочной информации. Поэтому никогда не используйте throw <exception parameter parameter> для выброса исключения.
В следующем разделе вы узнаете, как создать пользовательский тип исключения.