예외처리와 프로토타입
예외처리
개념
프로그램이 처리되는 중 특정한 문제가 발생하면 처리를 중단하고 다른처리를 하는 과정
원인
- 하드웨어
- 운영체제 설정
- 라이브러리 손상
- 사용자 입력오류
예외발생경우
- 0으로 나눈 경우
- 배열의 첨자가 범위를 벗어나는 경우
- 입/출력파일이 없음에도 요청이 있는 경우
- 형 변환이 부적절한 경우 등
예외처리를 통한 기대효과
- 정상종료 가능
- 예외 내용에 대한 보고 가능 (log)
- 정상적인 값으로 변경 가능
- 예외 발생 시 무시하고 계속 실행 가능토록 설정 가능
언어 별 예외 처리
C
- 예외처리 문법 없음
- 에러에 대한 헤더파일 존재함(errno.h)
extern int errno;
- 대표적 에러 처리 문자열 및 내용
선행처리 문자열 | 내용 |
---|---|
EFBIG | 인수목록이 너무 길다 |
EACCESS | 접근 거부 |
EAGAIN | 재시도 |
EBADF | 파일번호 오류 |
EEXIT | 이미 존재하는 파일 |
EFAULT | 잘못된 주소 |
EIO | 입/출력 오류 |
#include <stdio.h>
#include <errno.h>
int main(void) {
errno = EFBIG;
perror("error message:");
return 0;
}
실행 결과
error message:: File too large
JAVA
try {
// 실행 할 코드.
} catch(Exception e){ // 예외 객체의 매개변수
// try 문이 실패하면 처리되는 코드.
} finally {
// 예외 발생에 관계없이 무조건 처리되는 코드.
// finally는 작성하지 않아도 됨.
}
- JAVA의 대표적인 예외 타입
예외 타입(예외 클래스) | 예외 발생 경우 | 패키지 |
---|---|---|
ArithmeticException | 정수를 0으로 나누는 경우 | Java.lang |
NullPointerException | Null 레퍼런스 참조 | Java.lang |
ClassCastException | 타입 변환 오류 | Java.lang |
OutOfMemoryError | 메모리 부족 | Java.lang |
ArrayIndexOutOfBoundsException | 배열의 범위 오류 | Java.lang |
InputMismatchException | Scanner 클래스 메소드의 잘못된 사용 ex) nextInt() 시 문자 입력 등 | Java.util |
- 예외 처리 - JAVA
int a,b,result;
try{
a=scanner.nextInt();
b=scanner.nextInt();
result= a / b;
} catch(ArithmeticException e) {
// 첫번째예외처리
System.out.println("분모가0");
} catch(Exception e ) {
// 두번째예외처리
System.out.println("올바른입력이안되었음");
}
Python
try :
except Exception e:
finally:
- Python의 대표적인 예외 타입
예외 타입(예외 클래스) | 예외 발생 경우 |
---|---|
ZeroDivisionError | 정수를 0으로 나누는 경우 |
fileNotFoundError | 파일을 찾을 수 없을 경우 |
ValueError | 데이터 타입 오류 |
ModuleNotFoundError | 모듈을 찾을 수 없을 경우 |
indexError | 배열의 범위 오류 |
NotImplementError | 함수가 구현되지 않을 경우 |
- 예외 처리 - Python
data = "1234abc"
try:
data = int(a)
except ValueError:
print("error")
finally:
print("end")
실행 결과
error
end
예외 처리 - 에러 이름을 모르는 경우(Python)
try:
data = tuple()
data = "1a2b3c"
print("data:", data)
data2 = int(data)
except :
print("error")
# 위 코드는 에러가 어디서 발생한지 알 수 없음
실행 결과
error
try:
data = tuple()
data = "1a2b3c"
print("data:", data)
data2 = int(data)
except Exception as aa:
print("error", aa)
# 위 코드는 Exception 을 함께 print 함
실행 결과
data: 1a2b3c
error invalid literal for int() with base 10: '1a2b3c'
프로토타입
컴파일러에게 사용될 함수에 대한 정보를 미리 전달하는 것
C언어의 프로토타입 선언
- main 함수 바깥쪽에 선언함
- 프로토타입에 의해 정의된 반환 형식은 함수 정의의 지정된 바와 일치해야 함
#include <stdio.h>
void output();
int main(void){
output();
return 0;
}
void output(void){
printf("Good\n");
}
실행 결과
Good
조건에 맞는 C언어의 프로토타입을 구성해보자
조건:
void draw_line(int num);
- num의 숫자만큼 '-' 출력하여 선 그리기
void draw_line(int num);
int main(void){
while(1){
int num;
printf("1 ~ 10 숫자를 입력하세요: ");
scanf("%d", &num);
if (num < 0 || 10 < num) {
printf("정수가 아니므로 프로그램을 종료합니다\n");
break;
}
draw_line(num);
}
return 0;
}
void draw_line(int num){
int i;
for(i = 0; i < num; i++){
printf("-");
}
printf("\n");
}
실행 결과
1 ~ 10 숫자를 입력하세요: 3
---
1 ~ 10 숫자를 입력하세요: 6
------
1 ~ 10 숫자를 입력하세요: 11
정수가 아니므로 프로그램을 종료합니다