10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2
예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다. 예외는런타임오류를지칭 예외처리 (Exception Handling) 런타임오류를관리하고, 안전하게처리하는방법 오류에의해서비정상적으로프로그램이종료되는것을막아준다는의미 예외클래스들은최상위클래스인 Exception을상속받은 SystemException 클래스와 ApplicationException 클래스로부터파생 SystemException 클래스를상속받았다면 CLR에의해서만들어지는예외에대한클래스임을의미 사용자가직접예외클래스를만들려면 ApplicationException 클래스를상속 순천향대학교컴퓨터학부이상정 3 표준예외클래스 순천향대학교컴퓨터학부이상정 4
예외처리구문 순천향대학교컴퓨터학부이상정 5 ~catch~finally 문 런타임예외처리는 ~catch~finally 문을사용 ~catch~finally 문의형식 순천향대학교컴퓨터학부이상정 6
예제 10-1: 1 파일오픈예외처리예 파일을오픈할때파일이존재하지않는경우발생하는예외를처리하는프로그램 순천향대학교컴퓨터학부이상정 7 using System.IO; namespace Ex10_1_FileException 파일을오픈할때파일이존재하지않는경우발생하는예외 를처리하는프로그램 StreamWriter sw = null; // 예외가발생할수있는코드 sw = new StreamWriter(new FileStream("fnfexcetion.txt", FileMode.Open)); sw.writeline("c# Programming"); // 파일이존재하지않을경우발생하는예외를처리 catch (FileNotFoundException e) Console.WriteLine(e.FileName + " not found"); finally // 예외의발생여부에관계없이항상수행 if (sw!= null) sw.close(); 순천향대학교컴퓨터학부이상정 8
다중 catch 문 두개이상의예외가발생할수있을때에는여러개의 catch 문을사용하여발생한각예외에대해적절하게예외를처리 catch 문에서사용될예외객체는하위예외를상위예외보다먼저처리 순천향대학교컴퓨터학부이상정 9 namespace Ex10_2_MultiCatch int i = 100; int j = 0; Console.WriteLine(i / j); Console.WriteLine(" 예외없음 "); catch (OverflowException e) // 오버플로우예외를처리 Console.WriteLine(e.Message); catch (DivideByZeroException) // j가 0일때발생 Console.WriteLine("0으로나눌수없습니다!"); catch (Exception e) // 나머지예외를처리 Console.WriteLine(e.Message); 순천향대학교컴퓨터학부이상정 10 예제 10-2: 다중 catch 문사용예
throw 문 throw 문은예외를명시적으로발생시키는명령 순천향대학교컴퓨터학부이상정 11 예제 10-3: throw 문사용예 namespace Ex10_3_ThrowTest Console.WriteLine("1. 프로그램시작 "); // DLL의파일이미지또는실행가능한프로그램이유효하지않을때 throw되는예외 throw new BadImageFormatException(); // 예외를강제로발생 catch (Exception e) Console.WriteLine("2. 예외메시지출력 "); Console.WriteLine(e.Message); Console.WriteLine("3. 프로그램종료 "); 순천향대학교컴퓨터학부이상정 12
사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 13 사용자정의예외클래스 사용자정의예외 ApplicationException 클래스를상속받아서구현 상위클래스의기능을전부사용할수있으며사용자가추가적으로필요한부분을구현 순천향대학교컴퓨터학부이상정 14
예제 10-4: 사용자정의예외예 (1) namespace Ex10_4_UserException public class UserException : ApplicationException private string name; // 사용자정의예외 public UserException() : base() // base 메서드는상위클래스의생성자호출 // 생성자를통해예외를설명하는 Message 를제공 public UserException(string str, string name) : base(str) this.name = name; public string getusername() return name; 순천향대학교컴퓨터학부이상정 15 예제 10-4: 사용자정의예외예 (2) throw new UserException(" 오류발생 ", "Kim"); catch h(userexception e) Console.WriteLine("Message속성 : " + e.message); //StackTrace 는특정시점에실행중인모든메서드를추적 Console.WriteLine("Trace속성 : " + e.stacktrace); Console.WriteLine("getUserName():" + e.getusername()); 순천향대학교컴퓨터학부이상정 16
예외전파 예외전파 발생한예외를해당메서드내에서처리하는 catch 블록이없다면호출메서드로예외를전파 예외를전파시켜특정메서드에서예외를모두처리한다면보다효과적인예외처리가가능 프로그램의진입점에도달할때까지발생한예외의처리가없다면에러메시지를출력하고실행은종료 순천향대학교컴퓨터학부이상정 17 namespace Ex10_5_ExceptionPropagate void GrandParent() int x = 100; int y = 0; x = x / y; // 예외발생, Parent 메서드로전파 Console.WriteLine("GrandParent 메서드종료 "); void Parent() GrandParent(); // Main 메서드로전파 Console.WriteLine("Parent 메서드종료 "); Program p = new Program(); p.parent(); Console.WriteLine(" 예외없음 "); catch (ArithmeticException e) Console.WriteLine("ArithmeticException 전파 "); Console.WriteLine(" main의끝 "); 순천향대학교컴퓨터학부이상정 18 예제 10-5: 예외전파예