English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
지난 장에서 CLR가 자동으로 발생시키는 예외 처리 방법을 본いました. 이 장에서는 예외를 수동으로 발생시키는 방법을 보여드리겠습니다.
throw 키워드를 사용하여 예외를 수동으로 발생시킬 수 있습니다. throw 키워드를 사용하여Exception에서 파생된 어떤 타입의 예외도 던질 수 있습니다.
static void Main(string[] args) { Student std = null; try { PrintStudentName(std); } catch(Exception ex) { Console.WriteLine(ex.Message ); } Console.ReadKey(); } private static void PrintStudentName( Student std) { if (std == null) throw new NullReferenceException("Student 对象为null"); Console.WriteLine(std.StudentName); }
Student 객체가 null
위의 예제에서, Student 객체가 null 이면 PrintStudentName() 메서드가 NullReferenceException을 던집니다.
주의하세요, throw 키워드는 어떤 유�효한 예외 타입의 객체를 생성합니다. throw 키워드는 Exception 클래스에서 파생되지 않은 어떤 다른 타입과도 함께 사용할 수 없습니다.
catch 블록에서 예외를 다시 던지면 호출자에게 전달하고 호출자가 필요한 방식으로 처리할 수 있습니다. 아래 예제에서 예외를 다시 던집니다.
static void Main(string[] args) { try { Method1()); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); } } static void Method1()) { try { Method2()); } catch(Exception ex) { throw; } } static void Method2()) { string str = null; try { Console.WriteLine(str[0]); } catch(Exception ex) { throw; } }
위의 예제에서, Method2에서 예외가 발생했습니다. catch 블록은 throw 키워드만 사용하여 예외를 던집니다(throw e 대신). 이는 Method1의 catch 블록에서 처리되며, 여기서 다시 같은 예외를 다시 던지고, 마지막으로 Main() 메서드에서 처리합니다. 이 예외의 스택 트레이스는 이 예외의 전체 상세 정보를 제공합니다.
예외 매개변수를 다시 던지면 원래 예외를 유지하지 않고 새 예외를 생성합니다. 아래 예제에서 이를 보여줍니다.
static void Main(string[] args) { try { Method1()); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); } } static void Method1()) { try { Method2()); } catch(Exception ex) { throw ex; } } static void Method2()) { string str = null; try { Console.WriteLine(str[0]); } catch(Exception ex) { throw; } }
위의 예제에서 Main() 메서드에서 잡힌 예외는 Method1와 Main 메서드의 스택 트래킹과 함께 표시됩니다.当我们1throw ex를 다시 던질 때, 메서드 이름은 스택 트래킹에서 표시되지 않습니다.1따라서, throw <exception parameter parameter>를 사용하여 예외를 던지지 마세요.
다음 장에서는 사용자 정의 예외 타입을 생성하는 방법을 배울 수 있습니다.