날아라쩡글이의 블로그입니다.
Exception ,throw ,try~catch문 본문
728x90
반응형
예외처리
- 예외처리란 프로그램 실행 시 발생할 수 있는 오류에 대비하는 것으로 프로그램의 비정상적인 종료를 막고, 실행상태를 유지하는 것
- 에러의 종류
- 에러 (Error)
- 시스템, JVM의 잘못으로 발생되는 문제
- 개발자가 해결할 수 있는 문제가 아님
- 예외처리의 대상이 아님
- 시스템 관리자나 서버관리자가 확인 후 문제를 고칠 수 있다.
- 왠만해서는 발생되지 않으며, 치명적인 것이다.
- 예외 (Exception)
- 개발자의 코딩실수로 인해서 일어난다.
- 사용자가 잘 못 사용할 수 있다는 의미로 잘 못 사용하게 되면 원래의 프로그램이 꺼져버리기 때문에 예외처리 메세지를 보낸다.
- 사용자입장에서는 황당할 수 있기 때문에 꺼지지 않게, 어디에서 문제였는지를 알려준다.
- 중단되지 않게 하기 위해 에러 메세지를 출력한다.
- 예외 에러를 표시하기 위해서 예외 메세지가 출력된다. -> 코드를 변경하는 것은 상황이 변동 되었다.
- 이전 서버 프로그램
- 에러 (Error)
현재 서버 프로그램
요즘에는 오류가 날때에는 오류페이지 컨텐츠를 보내게 된다. 지금은 예전에 생각한 예외처리가 바뀌었다.
- 이전에는 개인별 컴퓨터에서 다운로드가 되고 사용자가 잘 못 사용하게 되면 중단되어 꺼져버리기 때문에 try catch문을 사용해서 유지가 되도록 만들었다.
- 그러나 지금은 오류페이지 컨텐츠를 보내기 때문에 예전처럼 try- catch문을 사용하지 않고, 웹의 경우는 잡는게 목적이 아니다.
- 요즘에는 예외 일괄 처리를 담당하는 부분을 프론트컨트롤러(자동화작업)에 있기 때문에 Spring의 서버에서도 에러가 발생한 경우 에러페이지를 보여달라고 코딩을 진행한다.
- 사용자도 웹기반으로 이용을 하고 있기 때문에 try - catch문을 강제하고 있지 않다. 발생된 예외가 프론트 컨트롤러까지 가게 두게 된다. 이제는 없애지 않는다.
예외(Exception)
- uncheckedException
- RuntimeException클래스와 그 자식 클래스들이다.
- 주로 개발자의 코딩 실수로 발생되는 오류들이다.
- 이클립스 내부에서 빨간줄을 보내줘서 신경 쓸 필요가 없다.
- 적절한 예외처리 해주고, 기억할 필요가 없다.
- 컴파일러가 예외처리 여부를 체크하지 않는다.
- 소스코드 고치기 전까지는 예외가 발생한다.
- 예외처리해도 근본적인 원인인 소스코드를 고쳐야한다.
- 예외처리 무용론 이라는 이야기가 나왔고, 예외 발생이 되면 어떤건지 알고, 전해주고, 고치면된다.
- 장애지점이 서버이기 때문에 굳이 바꿀 필요가 없다는 이야기가 나왔다.
- checkedException
- Exception클래스와 Exception클래스의 하위 클래스중에서 RuntimeException클래스의 하위클래스가 아닌 예외 클래스다.
- 사용자의 잘못된 사용으로 인해 발생하는 오류들이다.
- 컴파일러가 예외처리 구현여부를 반드시 체크한다.
- 예외처리 관련 코드가 구현되어있지 않으면 컴파일 오류가 발생한다.
- 최신의 라이브러리나 프레임워크에서는 CheckedException의 사용비중이 점점 줄어들고 있다.
예외처리
- try - catch 구문
- try{
- 예외발생이 예상되는 수행문;
- 예외발생이 예상되는 수행문;
- 수행문
- } catch(예외클래스 타입 변수명) {
- } catch(예외클래스 타입 변수명){
- } catch(Exception 변수명) {
- }
-
- try는 1개와 catch블록 1개가 일반적이다.
- try는 1개여야하고, catch블록은 여러개가 가능하다.
- try예상되는 수행문을 입력하고, 각기 다른 예외가 발생할 수 있어서 catch는 여러개를 작성한다.
- catch에 순서가 있다.
- 부모는 아래에 작성하고, 자식은 위에 작성한다.
- 수행문은 상관없다. 상속관계가 아닌 객체들도 상관없다.
- try에서 예외발생이 예상되는 수행문의 경우 변수명으로 예외가 들어가게된다.
- 마지막에 Exception을 작성한 이유는 생각도 못한 예외가 발생하게되면 클래스 형변환으로 적용되어, 어떤 예외라던지 전부 catch가 가능하도록 보험용으로 작성을 한것이다.
- catch블록에서 예외를 잡지않으면 프로그램이 비정상적으로 종료가 되는데, 그렇기 때문에 어떤 페이지에서 외국어처럼 글자가 깨진것을 확인할 수 있을 것이다. 그것이 예외처리가 제대로 되지않은 부분이다.
- catch블록에서의 작업내용
- 발생한 예외정보를 로그로 기록하기
- 사용자에게 예외발생원인 안내하기
- 개발자에게 오류수정을 위한 디버깅 메세지를 출력하기
- printStackTrack();
- 발생한 예외를 다른 예외로 바꾸기
- 예외 발생시 수행문을 종료하고 즉시, catch블록으로 이동한다.
- throw구문
- throw로 예외처리를 위임하는 것이다.
- 메소드에서 발생하는 예외를 직접 처리하지 않고, 그 메소드를 호출하는 측에서 예외처리를 위임하는 것이다.
- throws키워드를 사용해서 예외처리를 위임할 수 있다.
- 해당메소드에서 예외처리에 관련한 코드를 작성할 필요가 없다.
- 예외처리를 각각의 메소드에서 직접 개별적으로 처리하지 않고, 한 군데에서 일괄처리하게 만들 수 있다.
- public void method() throws 예외클래스명, 예외클래스명,...{
- 예외발생이 예상되는 수행문;
- } --> 예외클래스명이 몇개가 되던지 상관없다.
예외처리를 위임하기
- new FileWriter(), write(), flush(), close() 메소드가 IOException의 처리를 writeText()에게 위임함
- writeText()메소드는 IOException의 처리를 main()에게 위임함.
- main()메소드는 IOException의 처리를 JVM에게 위임함
- JVM에게 예외처리를 위임하는 것은 예외처리를 하지 않는 것과 동일하다.
- 마지막 처리는 꼭 해야한다. 프론트 컨트롤러에서는 꼭 해야하는 것이다. 안그러면 JVM에게 넘어가서 파일이 죽어버린다.
- 몇개를 떠넘겨도 상관없다. 나중에는 사용자정의예외처리로 한번에 예외처리를 진행할 예정이다.
반응형
'중앙 HTA (2106기) story > java story' 카테고리의 다른 글
싱글톤 객체 (0) | 2021.11.21 |
---|---|
추상화와 인터페이스 정리 (0) | 2021.09.28 |
내부 클래스, 익명클래스 (0) | 2021.09.28 |
추상클래스 (0) | 2021.09.26 |
추상화 (0) | 2021.09.24 |
Comments