예외처리(Exception Handling)
- 예외(Exception) : 예상하지 못했던 상황
- 형변환시(오버플로우 문제)
- 파일 처리시(파일을 못찾거나 파일 손상 등)
- DB연결시(네트워크 문제등)
- 일반적으로 예외는 프로그램에 악영향을 줄수있고, 모든 상황을 개발자가 대처하기 힘들기 때문에 예외처리를 한다.
예외객체
- 모든 닷넷 프로그래밍 언어는 동일한 예외 객체를 이용해서 예외처리를 한다.(예외처리를 위한 클래스 제공)
- 모든 예외처리 객체는 System.Exception이란 클래스로 부터 상속받는다.
- 각 예외의 종류별로 객체가 제공된다.
try-catch문
- try : 예외를 검사할 코드 블록을 갖는다.(try문 밖의 코드는 검사불가)
- catch : 예외 발생시 처리 코드 블록을 갖는다.
어떤 종류의 예외인지 구별이 가능하고 되도록 상세한 예외처리가 좋다.
try
{
실행코드
}
catch(예외객체)
{
처리코드;
}
다중catch문
- 보통 실행 코드들이 한 종류의 예외상황만을 발생시키지 않는다.
- 여러종류의 예외발생시 종류별로 예외 처리 가능
- try에서 발생한 예외중 가장 적절한 catch문으로 이동하여 처리한후 try~catch문을 빠져나온다.
- 동일한 예외객체를 2번 이상 반복불가
-> 동일한 예외상황을 처리가능할때 하위타입의 객체를 먼저 사용한다.
- 상위 예외객체가 위로 올라오면 안된다.
- try문은 하나의 catch문만 가질수 있다. -> 예외객체가 없는 catch
- 예외상황이 두개이상의 catch문에 해당되었을때는 먼저나온 catch문에서 잡는다.
try
{
실행코드
}
catch(예외객체)
{
처리코드;
}
catch(예외객체)
{
처리코드;
}
예외던지기(throw)
- 프로그램상에서 발생한 예외가 아닌 개발자가 임의로 예외 발생(강제로)
- 원래 예외가 발생할 상황이 아니지만 예외를 발생
- throw문으로 Exception객체를 전달한다.
finally문
- try ~ catch ~ finally
- 예외 발생시 반드시 처리해야 하는 구문을 기술
- 중요한 코드가 온다. Clean Up(마무리코드) 실행시 사용
- 일반적으로 지원(파일, DB)에 대한 작업시 사용
- 블록안에 goto, break, continue, return을 적을 수 없다.
(finally 취지에 어긋난다)
public static void exceptionTest05()
{
long num1;
int num2;
try
{
try
{
checked
{
num1 = Int64.MaxValue;
num2 = (int) num1; //예외발생
}
num2 = 0;
num1 = num1/num2; //예외발생
Console.WriteLine(num2);
}
catch(OverflowException e)
{
Console.WriteLine("OverflowException : {0}", e.Message);
}
catch(DivideByZeroException e)
{
Console.WriteLine("DivideByZeroException : " + e.Message);
}
catch(Exception e)
{
Console.WriteLine("Exception : " + e.Message);
}
finally
{
//break; 사용할수 없음.
Console.WriteLine("프로그램이 종료되었습니다.");
throw new Exception();
// finally에서 예외를 날리는것은 가능하나 try구문이 중첩되어 있지 않다면
// 처리할곳이 없으므로 에러가 난다.
}
}
catch(Exception e)
{
//위의 finally 구문에서 throw를 날린 예외구문은 여기서 처리한다.
Console.WriteLine(e.Message);
}
}
try~catch 가이드 라인
- 각각의 목적에 맞게 코드를 분할
- catch문에 프로그램 로직이 들어가거나 finally에 로직이 들어가는 경우
- catch는 예외처리에 집중, finally는 자원해제에 집중
- try는 최소한의 구문만 감싼다
- 되도록 구체적인 객체를 사용한다.
- 보통 Main에서 많이 사용한다ㅣ -> 프로그램 안정성을 위해
변수의 범위
지역변수(Local Variables)
- 모든 변수는 자신의 영역권을 가진다
- 변수가 존재할 수 있는 영역
- 지역변수는 선언 영역 안에서만 사용가능
- 메소드내, 반복문의 코드 블록내 등..
공유변수(Shared Variables)
- 클랙스 전체 영역을 대상으로 변수선언
- 클래스 내부의 메소드내에서도 자유롭게 사용
- 영역 충돌시 가까운 변수가 인정(지역변수 우선)
- 영역 총돌시 클래스명, 변수명으로 공유변수 사용
- Namespace단위로 공유되는 변수는 없다.
- 프로그램 시작시 생성, 프로그램 종료시 소멸
[출처] [펌] [20040426] 예외처리, 변수|작성자 눈꽃천사