[완료]java에서 예외처리 방식에 대해 질문드립니다.

anaud2의 이미지

안녕하세요
C로 프로그램을 만들고 java로 포팅을 하고 있는 사람입니다.
항상 여기에서 많은 도움을 받는 사람으로 항상 고맙게 생각합니다.

c에서는 DLL로 만들기에 그함수에 대한 처리에 대해 예외처리를 에러코드를 던지는걸로
했습니다. java에서는 예외처리가 있기에 이것을 활용해 보려구 하는데요

java도 제가 만든 클래스(함수2개)를 가져다가 사용하는 개발자가 있을것으로 생각됩니다.
그분을 위해 예외처리를 어케 하는게 좋을지. 일반적으로 프로그램을 계발을 할때 어케
예외처리를 하는게 맞는지 질문을 드리겠습니다.

우선 위의 지시가 예외를 사용자가 확인을 할수 있게 보여줘라 라고 말씀을 하시더라구요
그렇다고 화면에 출력은 당연히 안될테고^^;
그래서 책을 보면서 몇가지 방법을 생각해봤습니다.

윗분은 예외를 일으키는 클래스를줘라(?) 라는 이상한 표현을 하셨늕데 제가 위에서말한
제 클래스를 가져다 쓸 계발자에게 알려주게 하라 인거 같은데요

일단 제가 만든 클래스에서 예외처리를 하지 않고 throws를 하는 방법입니다.
제가 만든 함수 a() throws Exception
이렇게 하면 사용자에게 처리를 맡기게 되고 거기서 try catch하면 되지 않을까요

두번째는 기본골격은 첫번째와 같지만 thow 로 예외처리를 새로 만드는것입니다.
음 이부분은 thow에 대한 제 개념이 바로 서질 않아서 약간 상상같은건데요
에러내용에 부연설명을 위해 만들면 어떨까 합니다.

글의 두서가 좀 없네요 일단 상관의 지시라면 첫번째 방법을 써야 사용자에게 알려줄수
있지 않을까요? 그냥 제함수에서 try catch(Exception e)해서 e.printStackTrace()한다면
화면 출력이 되어서 제 함수를 사용하는 사용자는 못보지 않을까요?
예외를 처리 한다란 표현이 좀 헷갈립니다. try catch로 잡고 system.out.println을하면
기본으로 시스템에서 알려주는 에러코드외 조금덧붙인 설명이 될것도 같고..
C처럼 printf문을 해서 시스템에따라 안보일수 있기에 에러코드 처럼 예외를 사용하는
사용자에게 예외를 전달(즉 리턴)을 해줘야 하는건지...

아 참 마지막으로 예외 처리에서 저같은경우 제가 만든함수 시작에
try{
끝날때}catch(Exception e){}로 되어있습니다.
책에서 보니까 catch를 할때에 세부적으로 함수별로 IOException, FileNotFoundException등
으로 다중 catch를 하던데요 최상위 클래스(Exception e)로 처리를 해도 되나요?
아니면 예외를 일으킬수 있는 함수들(io.read, write등)모두 api를 찾아보면서
만들어 줘야 하나요?

이부분이 책을봐도 이해가 안되서 질문을 올립니다. 너무 글이 두서가 없어 죄송합니다.

M.W.Park의 이미지

정확한 상황은 잘 모르겠으나,
예외 처리의 기본은 자기가 처리할 수 있는 경우에는 처리하고,
아닌 경우에는 호출한 쪽으로 전파(던지기?)해서 call stack을 타고 나가게(?) 하는 것입니다.

몇몇 특수한 경우를 제외하고는 대부분의 경우 던지는 것이 좋은 선택입니다.

처리하지도 않고 그냥 먹어버리는 것(비어 있는 catch)은 자살행위입니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

jick의 이미지

임의 exception을 빈 catch로 잡는 것은 "이 프로그램에서 이 상황이 발생하면 아무도 추적 못하게 시스템이 서서히 맛이가는 현란한 쇼를 보여주마 음하하!" 정도의 의미가 있습니다. 한번 걸리면 전 개발팀이 사이좋게 밤새는 상황을 맞을지도...

Production code에 절대! 절대! 절대로!! 그런 거 넣으시면 안됩니다.

oomymy의 이미지

상황에 따라 프로그래밍 하는 방법이 다르겠죠.

만일 님께서 다른 사람이 사용하는 라이브러리를 만드시는 입장이라면,
라이브러리 내에서 처리해야할 예외와 라이브러리 바깥에 알려줘야 하는 예외를 구분하실 수 있겠죠.
그럼 뭘 catch해야하고 뭘 throws해야 할지 아실 겁니다.

개인적으로 라이브러리는 화면에 뭔가를 출력해선 안 된다고 생각하는 입장이라,
라이브러리 내에서 예외를 잡아 e.printStackTrace()를 하는 것은 매우 안 좋은 습관이라고 생각합니다.
심지어 라이브러리를 사용하는 애플리케이션이 직접 처리해야할 예외를 라이브러리가 먹어버리는 경우가 되기도 하죠.

그리고 Exception e로 한 번에 잡는 것과 사용하는 함수가 발생할 수 있는 예외를 모두 잡아서 별도로 처리하는 것 역시
상황에 따라 다르죠. 예를 들어 io를 하는 작업인데, io가 eof가 왔을 때와 thread가 interrupt가 됐을 때, io가 실패했을 때
이 상황을 어떻게 처리할 것인지 정책을 꼼꼼히 세우는게 좋죠. 종료시킬 것인지, 다시 한 번 시도할 것인지, 함수 위로 예외를
올려 보낼 것인지.... 그런 경우에라면 예외를 각각 잡아서 처리하는게 좋고, 그게 아닐 경우에만 Exception e로 잡아서 처리합니다

좀 더 견고하고 잘 짜여진 프로그램이라면 예외 처리가 잘 되어 있어야죠.

anaud2의 이미지

모두들 답변이 저에게 많은 도움이 되었습니다.

특히 oomymy님의 답변이 제가 궁금해 하는 모든것이 들어있네요

dragonkun의 이미지

라이브러리를 짜신다면 거의 throw 해 주시면 되지 않을까요?

어차피 자바는 보통 다 IDE를 사용하니 컴파일 하기도 전에 처리되지 않은 예외가 있으면..

IDE가 알아서 try, catch 를 만들어 주거나 만들라고 경고를 내 주더군요.

IOException, FileNotFoundException 등등 따로 처리해 주는 건..

필요할 때만 그렇게 해 주시면 됩니다.

여러 예외를 던질 수 있는 코드가 있고, 각각의 상황에 따라 다른 반응이 필요하다면 따로 처리해 줘야 겠죠..
---
Emerging the World!

Emerging the World!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.