Exception

마동찬·2023년 8월 1일

오류(error)와 예외(exception)

소스코드를 작성할 때 문법상 오류가 날 경우 컴파일 자체가 되지 않으며 에러를 발생시킵니다. 문법에 맞지 않은 코드를 컴파일하려고 하면 컴파일러는 문법 오류(syntax error)를 발생시킵니다.

또한 문법상 오류는 없지만 프로그램이 실행되면서 발생하는 오류가 있습니다.

이와 같이 컴퓨터에서 시스템이 동작하면서 예상치 못한 사태가 발생하여 프로그램이 영향받는 것을 오류와 예외로 구분할 수 있습니다.

오류(error)는 시스템에서 프로그램에 문제를 발생시키며 실행 중인 프로그램을 종료시킵니다.

이러한 오류는 예측하여 처리할 수 없는 것이 대부분입니다.

하지만 예외(exception)는 오류와 마찬가지로 프로그램을 비정상적으로 종료시키지만 발생할 수 있는 상황을 미리 예측하여 처리할 수 있습니다.

따라서 개발자는 예외 처리(exception handling)를 통해 프로그램의 비정상적인 종료를 방지할 수 있습니다.


요약

exception : 코드에서 발생하며 예측, 처리 가능

  • (checked exception) : 컴파일 단계에서 확인. 반드시 예외 처리 필수

  • RuntimeException : 런타임 단계에서 확인. 개발자의 부주의로 발생

error : jvm에서 발생 (우리가 건드릴 수 없다)

📑 Exception의 구조

try{
   // 예외가 발생할 수 있는 명령문들
} catch(발생하면 잡아줄 예외) {
   // 예외가 발생했을 때 명령;
} finally {
   // 정상 종료 or 예외 발생 상관없이 무조건 실행되어야 하는 명령;
}

예외 처리인 try / catch / finally문의 형태입니다.

try 영역에 예외가 발생할 수 있는 명령문을 작성하며 catch 영역에 예외가 발생했을 때의 명령을 작성합니다.

또 finally 영역에는 정상 종료나 예외 발생에 상관없이 무조건 실행하는 명령을 입력합니다.

📑 예외 처리의 순서

  1. try 블록에 도달한 프로그램의 제어는 try 블록 내의 코드를 실행합니다.

이때 만약 예외가 발생(throw) 하지 않고, finally 블록이 존재하면 프로그램의 제어는 바로 finally 블록으로 이동합니다.

  1. try 블록에서 예외가 발생하면 catch 핸들러는 다음과 같은 순서로 적절한 catch 블록을 찾게 됩니다.

2-1. 스택에서 try 블록과 가장 가까운 catch 블록부터 차례대로 검사합니다.

2-2. 만약 적절한 catch 블록을 찾지 못하면, 바로 다음 바깥쪽 try 블록 다음에 위치한 catch 블록을 차례대로 검사합니다.

2-3. 이러한 과정을 가장 바깥쪽 try 블록까지 계속 검사하게 됩니다.

2-4. 그래도 적절한 catch 블록을 찾지 못하면, 예외는 처리되지 못합니다.

  1. 만약 적절한 catch 블록을 찾게 되면, throw 문의 피연산자는 예외 객체의 형식 매개변수로 전달됩니다.

  2. 모든 예외 처리가 끝나면 프로그램의 제어는 finally 블록으로 이동합니다.

  3. finally 블록이 모두 처리되면, 프로그램의 제어는 예외 처리문 바로 다음으로 이동합니다.

Ref. https://12716.tistory.com/entry/Java-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%ACException

profile
새내기개발자 성장기록

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기