본문으로 건너뛰기

예외처리와 프로토타입

예외처리

개념

프로그램이 처리되는 중 특정한 문제가 발생하면 처리를 중단하고 다른처리를 하는 과정

원인

  • 하드웨어
  • 운영체제 설정
  • 라이브러리 손상
  • 사용자 입력오류

예외발생경우

  • 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
NullPointerExceptionNull 레퍼런스 참조Java.lang
ClassCastException타입 변환 오류Java.lang
OutOfMemoryError메모리 부족Java.lang
ArrayIndexOutOfBoundsException배열의 범위 오류Java.lang
InputMismatchExceptionScanner 클래스 메소드의 잘못된 사용
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언어의 프로토타입 선언

  1. main 함수 바깥쪽에 선언함
  2. 프로토타입에 의해 정의된 반환 형식은 함수 정의의 지정된 바와 일치해야 함
#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
정수가 아니므로 프로그램을 종료합니다