예외처리 - Programming Language

seunghw·2021년 12월 9일
0

CS

목록 보기
1/1
post-thumbnail

예외 처리



1. 예외처리란?

  • 비정상적인 사건을 예외(exception)이라고 한다.
  • 이러한 여외가 탐지되었을 때 프로그램의 중단 없이 적절한 행동을 취해 다시 정상적으로 실행회도록 하는 메커니즘을 예외처리라 하고, 예외를 처리하는 부분을 예외처리기라고 한다.


2. Ada의 예외처리

예외설명
Constraint_Error배열 첨자 혹은 부분 범위 경계 초과 오류, 오버플로, 0으로 나누기 등으로 발생
Program_Error선언의 동적처리의 실패했을 때
Storage_Error동적 메모리로 할당에 실패했을 때
Tasking_Error병행성 제어 오류에 의해 발생



2.1 예외처리 예제

begin

 '''

exception
	when 예외이름1 =>
		문장들
	when 예외이름2 =>
		문장들
end;
  • exception 다음에 when으로 시작되는 형태.
  • 예외가 발생하면 그 시점에서부터 이후는 실행을 안하고 예외 처리 부분 실행.


2.2 예약어

예약어
My_Error : exception

위의 예약어는 raise My_Error 라고 작성해야 발생



2.3 예외가 발생한다면?

처리기를 찾아 주변부터 탐색 시작. 만약에 없으면 그 부분을 호출한 곳으로 거슬러 올라가서 탐색.



2.4 예외처리기에서 모든처리가 안된다면?

예외처리 할만큼 하고 다시 전파. 이 때 꼭 raise 명시해야함



2.5 Suppress pragma = 미리 정의된 예외에 대한 검사 중단 기능

pragma suppress(범위_체크);

위처럼 작성하면 범위_체크 부분의 범위 검사를 하지 않음



3. C++ 예외처리

  • 정의된 예외는 없다. 모든 예외는 명시적 발생!



3.1 예외처리 예제

try {
 ``` /* 예외 발생 영역 */
}
 catch( 형식 매개변수 ) { /* int, float, double 등등 */
```  /* 예외 처리 영역 */
}
 catch(...) { /* 만능! */


}
  • 여기서 형식 매개변수는 처리할 예외의 종류이다.
    • ex) int로 쓰면 int 쪽 catch 실행. double로 쓰면 double 쪽 발생!
  • "..."는 만능!
    • 그래서 맨 마지막에 써야 의미가 생긴다!!!

3.2 명시적 발생을 위한 Throw

throw x;
  • 이러면 바로 처리기로 간다.



3.3 예외 발생했지만 못찾으면?

예외가 발생하면 처리기를 주변부터 찾아 나가고 없으면 Ada처럼 호출한 곳까지 거슬러 올라가서 찾는다.

하지만, 처리기를 결국 찾지 못한다면 terminate() 가 호출되면서 프로그램이 종료된다

쉽게 말해서 try 갔다가 catch 못찾으면 terminate() 발생 후 종료



3.4 발생시킬 수 있는 예외 명시 가능!

ex) 1

void sub() throw(int, double)
  • int, double은 처리 하고 다른거 뜨면 unexcepted() 발생하고 종료합니다.

ex2 )

void sub() throw()
{
	```
}
  • 비위놓으면 어떠한 예외도 발생하지 않는다.

ex3 )

void sub()
{
	```
}
  • 어떠한 타입의 예외도 발생가능



4. Java의 예외처리

  • Java는 미리 정의된 예외, 사용자가 직접 정의한 예외 둘 다 있다.



4.1 미리 정의 된 예외

예외설명
ArithmeticException0으로 나누기, 산술오류
ArrayIndexOutOfBoundsException배열 첨자 범위경계 초과 오류
NegativeArraySizeException배열 크기를 음수로 저장했을 때
NullPointerExceptionnull 객체에 접근했을 때



4.2 예외 클래스 계층 구조

object
   |____ Throwable
			|________ Exception
			|           |_________IOException    -- 입출력 오류
			|           |_________RuntimeExcept  -- 0 나누기, 배열첨자범위 초과 등
			|           |_________...               프로그램 실행 관련 오류
			|           |_________사용자 정의예외 --  사용자 정의
			|
			|________ Error
				|_____ ...
				|_____ ...
				|_____ outofMemory



4.3 C++과의 차별점 Finally

try {
	```
}
catch {
	```
}
finally {
	```
}
  • 예외가 있든 없든 finally 절은 무조건 실행된다.



4.4 어떤건지 반드시 명시!

발생한 예외처리가 해당 부프로그램에 없으면 호출프로그램에 전파되는데
어떤 예외가 발생하는지 명시해야한다.

💡 하지만! RuntimeException과 Error 예외는 Java 시스템에 의해 자동 발생된다. 그래서 throws 명시를 하지 않아도 된다.



4.5 사용자 직접 처리 설정가능!

ex1)

try {
	system.out.println( ~~~ ); <=== 발생!!!
}
catch( ~~~~ ){
	``` <=== 실행!!!
}

ex2) 예외처리 발생하는 문장 만들기

  1. 준비물
public class myException extends Exception
  • 최상위 클래스인 Exception을 상속받게 해야한다.
  1. 실행
throw new myException();
  • 이렇게 발생가능하다!
profile
Lumos

0개의 댓글