1. 일반적인 에러처리로 해결할 수 없는 상황에서의 에러처리가 가능하다는 점.
2. 에러가 생겼을 경우에 에러에 대한 상세한 정보(call stack 등등..)에 대한 내용을 내보낼 수 있는점.
3. 한 블록 내에 여러번의 예외처리를 해야만 하는 경우에, 한번에 해결할 수 있는 점.
4. Return value를 내보낼 수 없는 함수(생성자, 소멸자 등)에서 throw를 통해서 예외처리가 가능한 점...
등등을 들 수 있겠지만, 사실 저도 잘 안씁니다. 골치아픈일이 벌어질때가 있거든요.
딱 한가지 쓰는 경우가 있는데, 디버깅이 불가능한 상황에서, 에러가 발생할 때, 디버깅 정보를 exporting 할 수 있도록 하고 있습니다 ^^;
2008.10.08 22:40:33 (*.152.71.55)
처음처럼
안군 //
혹시 전체 코드를 전부 try 로 잡고;; catch 하는건가? ^^;;;
디버그 정보를 남기는 방법은 더 좋은게 있지 않냐? 우리가 예전에 그 프로젝트에서 썼던 방법 같은거??
히스님 //
개인적인 느낌으로는 뭐.. 코드가 좀 더 깔끔하게 구분되는게 제일 큰 장점이지 싶습니다.
아.. 이건 딱 애러 처리 코드구나.. 뭐 이런거죠 ;;;
다른건 안군의 말을 참고하세요~ 잘 설명했네 ㅋㅋㅋ
1. 만약 -1이 "의미 있는" 값이라면 어떻게 하시겠습니까? (물론 반드시 이렇게 해야할 경우는 별로 없을 것 같긴 합니다.)
2. 안군님이 말씀하신 것처럼, ...유효성검사2 ,유효성검사3, 유효성검사4, 유효성검사5... 까지 줄줄이 붙여보면 조금씩 심기가 불편해지기 시작할 겁니다. 그나마 이런 코드는 그나마 간단하고 너무 길지 않다면 그냥 이렇게 쓰는 게 나을 겁니다(뒤에 설명). 하지만 만약에 이 if문 안에서 또 다른 예외를 처리해야하고, 그 예외 안에서 또다른 예외...예외...예외.(아마도 메모리 반환과 파일 입출력, 뭐 그런 것들을 해야할 때)....... 머리가 아파옵니다.
사실 if문을 쌓는 것은 그리 어렵지 않습니다. 하지만 자고 일어나서 다시 보면 좀 어지러울 겁니다. 그리고 유지보수를 다른사람이 해야한다면 어쩌면 언젠가 멱살을 잡히게 될지도 모를 일입니다.
3. 함수에서 다른 함수를 호출하는 것이 몇 번 반복 되다보면, 끝에서 끝까지 에러를 리턴하고 이를 받아서 "확인"하는 절차가 복잡해지게 됩니다. 함수 깊숙히 들어갈 수록 점점 수렁으로 빠지기 시작할 것입니다.
사실 위에 제가 예를 든 상황들은 그리 일반적이지 않다고 생각하고, 일반적인 경우는 그냥 if문을 쓰는 게 더 낫습니다. try ~ catch가 보기에는 편할지 몰라도, 사실은 예외가 발생하면 실행 되는 내부 루틴이 상당하기 때문입니다.
게다가 안군님 말씀처럼 IDE를 쓸 수 없는 상황에서는 매우 도움이 되겠습니다만, IDE를 쓰는 환경에서는 오히려 방해가 되기도 하고요.
한 가지 더 덧붙이자면, 처리해야하는 예외가 많다면 사실상 프로그래밍 전에 설계 단계에서 예외 클래스를 미리 설계해야 합니다. 주먹구구식으로 만들기는 좀 어렵다지요.
PS. 제 딴에는 맞을거라 생각하고 적는 글입니다만, 실력이 미약한지라 확신은 못 하겠습니다... 틀린부분이 있다면 가차 없이 지적을 부탁드립니다.
PS2. 여담으로 C++과는 다르게, JAVA의 try ~ catch는 상당히 강력합니다.
a = 0;
MyClass dog = null;
try{
b = 20/a;
dog.run();
//} catch(NullPointerException ne) {
// System.out.println("멍멍이가 없어요.");
// } catch(ArithmeticException ae) {
// System.out.println("0으로는 나눌 수 없어요.");
// }
} catch(Exception e) {
System.out.println("여기서 다 잡을 수 있습니다");
}
2008.10.09 10:36:05 (*.56.62.65)
히스
답변 감사합니다.^^
자바같으경우엔 예외가 발생하면 catch에서 다 잡지만
C++은 throw가 발생해야지만 catch에서 잡는건가요??
2008.10.09 14:26:17 (*.39.234.143)
안군
처음처럼// 그 방법이 unhandled exception filter 말하는거지? 그게 결국 예외처리잖아;;
뭐, try-catch 쓰는건 아니고 SEH지만, 그게 그거지 뭐;;
2008.10.10 01:36:04 (*.34.176.73)
꼬마네꼬
히스님// 네. 정확히 말하면 자바의 경우엔 catch가 다 잡는 것은 아니고, 어떤 예외가 발생했는지 JVM이 판단해서 catch로 잡는다고 설명하면 될 것 같습니다.
(조금 다르긴 하지만 if() ~ throw를 JVM이 직접 해준다는 이야기가 되겠죠.)
추가로 제가 든 예에서 주석 '//'들을 지워주면,
20을 0으로 나누려고 했을 때 발생하게 되는 ArithmeticException에 의해 해당 catch문으로 진입하고,
만약 b = 20/a;에서 예외가 발생하지 않아 dog.run()이 실행되려 한다면, dog는 null이므로 NullPointerException이 발생하여, 해당 catch문으로 진입합니다.
Exception 클래스는 이들의 상위 클래스로 앞서 잡아내지 못한 모든 예외를 잡아낼 수 있습니다.
아니면 익셉션을 catch하지 않고 메소드 밖으로 던질(throw) 수도 있습니다.
(이 경우엔 해당 메소드를 쓰는 곳에서 호출 부분을 try~catch로 감싸줘야겠죠.)
이런 강력하고 편리한 기능 덕분에 자바를 사용하게 되면 C++과는 다르게 -아주 자연스럽게- try~catch문을 쓰게 됩니다. 전 처음엔 좀 어색하고 코드를 읽기 어렵게 느껴졌지만, 금방 익숙해지더군요. 왜냐하면 일단 수 많은 API들이 예외를 던져대거든요. (...)
2. 에러가 생겼을 경우에 에러에 대한 상세한 정보(call stack 등등..)에 대한 내용을 내보낼 수 있는점.
3. 한 블록 내에 여러번의 예외처리를 해야만 하는 경우에, 한번에 해결할 수 있는 점.
4. Return value를 내보낼 수 없는 함수(생성자, 소멸자 등)에서 throw를 통해서 예외처리가 가능한 점...
등등을 들 수 있겠지만, 사실 저도 잘 안씁니다. 골치아픈일이 벌어질때가 있거든요.
딱 한가지 쓰는 경우가 있는데, 디버깅이 불가능한 상황에서, 에러가 발생할 때, 디버깅 정보를 exporting 할 수 있도록 하고 있습니다 ^^;