# ์์ธ์ฒ๋ฆฌ (Exception Handling)
written by sohyeon, hyemin ๐ก
# 1. ํ๋ก๊ทธ๋จ ์ค๋ฅ
ํ๋ก๊ทธ๋จ ์คํ ์ค ์ด๋ค ์์ธ์ ์ํด ์ค์๋ํ๊ฑฐ๋ ๋น์ ์์ ์ผ๋ก ์ข
๋ฃ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ
์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ ์์ธ์ ํ๋ก๊ทธ๋จ ์๋ฌ ๋๋ ์ค๋ฅ๋ผ๊ณ ํ๋ค.
๋ฐ์์์ ์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ด ๋์ข ๋ฅ๋ก ๊ตฌ๋ถํ๋ค.
- ์ปดํ์ผ ์๋ฌ (compile error) : ์ปดํ์ผ ์์ ๋ฐ์ํ๋ ์๋ฌ
- ๋ฐํ์ ์๋ฌ (runtime error) : ์คํ ์์ ๋ฐ์ํ๋ ์๋ฌ
- ๋ ผ๋ฆฌ์ ์๋ฌ (logical error) : ์คํ์ ๋์ง๋ง ์๋์ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ
์๋ฐ์์๋ ์คํ ์์(run time) ๋ฐ์ํ๋ ํ๋ก๊ทธ๋จ ์ค๋ฅ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ถํ๋ค
- ์๋ฌ(error): ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ด๋ ์คํ์ค๋ฒํ๋ก(OutOfMemoryError, StackOverflowError)์ ๊ฐ์ด ์์ต๋ ์ ์๋ ์ฌ๊ฐํ ์ค๋ฅ
- ์์ธ(exception): ์ฝ๋์ ์ํด ์์ต๋ ์ ์๋ ๋ค์ ๋ฏธ์ฝํ ์ค๋ฅ
ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ธ์ ๋ํ ์ ์ ํ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ๋์์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ๋น์ ์์ ์ธ ์ข
๋ฃ๋ฅผ ๋ง์ ์ ์๋ค.
# 2. ์์ธ ํด๋์ค์ ๊ณ์ธต๊ตฌ์กฐ
๋ชจ๋ ํด๋์ค์ ์กฐ์์ Objectํด๋์ค ์ด๋ฏ๋ก Exception๊ณผ Errorํด๋์ค ์ญ์ Objectํด๋์ค์ ์์๋ค์ด๋ค.
Object
|
Throwable
/ \
Exception Error
/ \ / \
IOException RuntimeEx.. .. OutOfMemoryError
๋ชจ๋ ์์ธ์ ์ต๊ณ ์กฐ์์ Exception class์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
Exception
|
|--- IOException
|--- ClassNotFoundException
|--- ...
|--- RuntimeException
|--- ArithmeticException
|--- ClassCastException
|--- NullPointerException
|--- ...
|--- IndexOutOfBoundsException
๋ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด์ง๋ค.
Exception ํด๋์ค๋ค
: ์ฌ์ฉ์์ ์ค์์ ๊ฐ์ ์ธ์ ์ธ ์์ธ์ ์ํด ๋ฐ์ํ๋ ์์ธRuntimeException ํด๋์ค๋ค
: ํ๋ก๊ทธ๋๋จธ์ ์ค์๋ก ๋ฐ์ํ๋ ์์ธ
# 3. ์์ธ์ฒ๋ฆฌํ๊ธฐ
# 3-1. ์์ธ์ฒ๋ฆฌ๋?
- ์ ์: ํ๋ก๊ทธ๋จ ์คํ ์ ๋ฐ์ํ ์ ์๋ ์์ธ์ ๋ฐ์์ ๋๋นํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ
- ๋ชฉ์ : ํ๋ก๊ทธ๋จ์ ๋น์ ์ ์ข
๋ฃ๋ฅผ ๋ง๊ณ ์ ์์ ์ธ ์คํ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ
์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด try-catch๋ฌธ
์ ์ฌ์ฉํ๋ค.
# ex) ์์
class ExceptionEx1{
public static void main(String args[]) {
try {
try{ } catch(Exception e){ }
}catch (Exception e){
try{ } catch(Exception e){ } // --> error 'e' ๊ฐ ์ค๋ณต ์ ์ธ
}
}
}
# 3-2. ํน์ง
- try๋ธ๋ญ ๋๋ catch๋ธ๋ญ์ ๋ ๋ค๋ฅธ try-catch๋ฌธ์ด ํฌํจ๋ ์ ์๋ค.
- catch๋ธ๋ญ ๋ด์ ๋ ํ๋์ try-catch๋ฌธ์ด ํฌํจ๋ ๊ฒฝ์ฐ, ๊ฐ์ ์ด๋ฆ์ ์ฐธ์กฐ๋ณ์๋ฅผ ์ฌ์ฉํด์๋ ์๋๋ค.
# 4. try-catch๋ฌธ์ ํ๋ฆ
try๋ธ๋ญ ๋ด์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ
๋ฐ์ํ ์์ธ์ ์ผ์นํ๋ catch๋ธ๋ญ์ด ์๋์ง ํ์ธ
์ผ์นํ๋ catch๋ธ๋ญ์ ์ฐพ๊ฒ๋๋ฉด, ๊ทธ catch๋ธ๋ญ ๋ด์ ๋ฌธ์ฅ๋ค์ ์ํํ๊ณ
์ ์ฒด try-catch๋ฌธ์ ๋น ์ ธ๋๊ฐ์ ๊ทธ ๋ค์ ๋ฌธ์ฅ์ ๊ณ์ํด์ ์ํ
๋ง์ผ ์ผ์นํ๋ catch๋ธ๋ญ์ ์ฐพ์ง ๋ชปํ๋ฉด, ์์ธ๋ ์ฒ๋ฆฌ๋์ง ๋ชปํ๋ค.
try๋ธ๋ญ ๋ด์์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ
- catch๋ธ๋ญ์ ๊ฑฐ์น์ง ์๊ณ ์ ์ฒด try-catch๋ฌธ์ ๋น ์ ธ๋๊ฐ์ ์ํ์ ๊ณ์ํ๋ค.
# 5. ์์ธ์ ๋ฐ์๊ณผ catch๋ธ๋ญ
# 5-1. ์์ธ์ ๋ฐ์๊ณผ ์ฒ๋ฆฌ
catch๋ธ๋ญ์
๊ดํธ()
์๋ธ๋ญ{}
๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ธ ์๋๋ฐ,
๊ดํธ()
๋ด์๋ ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ์์ธ์ ๊ฐ์ ํ์ ์ ์ฐธ์กฐ๋ณ์ ํ๋๋ฅผ ์ ์ธํด์ผ ํ๋ค.์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ค.
์์ธ๊ฐ ๋ฐ์ํ ๋ฌธ์ฅ์ด try-catch๋ฌธ์ try๋ธ๋ญ์ ์๋ค๋ฉด, ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ catch๋ธ๋ญ์ ์ฐพ๊ฒ๋๋ค.
์ฒซ๋ฒ์งธ catch ๋ธ๋ญ๋ถํฐ ์ฐจ๋ก๋ก ๋ด๋ ค๊ฐ๋ฉด์ catch๋ธ๋ญ์ ๊ดํธ()๋ด์ ์ ์ธ๋ ์ฐธ์กฐ๋ณ์์ ์ข ๋ฅ์ ์์ฑ๋ ์์ธํด๋์ค์ instance์ instanceof ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฒ์ฌํ๊ณ ๊ฒฐ๊ณผ๊ฐ true์ด๋ฉด ์์ธ์ฒ๋ฆฌํ๋ค.
๋ชจ๋ ์์ธ ํด๋์ค๋ Exceptionํด๋์ค์ ์์์ด๋ฏ๋ก Exceptionํด๋์ค ํ์ ์ ์ฐธ์กฐ๋ณ์๋ฅผ ์ ์ธํด ๋์ผ๋ฉด ์ด๋ค ์ข ๋ฅ์ ์์ธ๊ฐ ๋ฐ์ํด๋ ์ด catch๋ธ๋ญ์ ์ํด ์ฒ๋ฆฌ๋๋ค.
# ex) ์์
class ExceptionEx {
public static void main(String args[]) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(0/0); // 0์ผ๋ก ๋๋ ArithmeticException๋ฐ์
System.out.println(4); // ์คํ๋์ง ์๋๋ค
}catch (ArithmeticException ae){
if (ae instanceof ArithmeticException)
System.out.println("true");
System.out.println("ArithmeticException");
}catch (Exception e){ //ArithmeticException์ ์ ์ธํ ๋ชจ๋ ์์ธ
System.out.println("Exception");
}
System.out.println(6);
}
}
# ์คํ๊ฒฐ๊ณผ
1
2
3
true
ArithmeticException
6
# 5-2. ์์ธ์ ๋ํ method
์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์์ฑ๋๋ ์์ธํด๋์ค์ ์ธ์คํด์ค์๋ ๋ฐ์ํ ์์ธ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ธ ์์ผ๋ฉฐ
๋ค์ method๋ค์ ํตํด ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
- printStackTrace(): ์์ธ๋ฐ์ ๋น์์ ํธ์ถ์คํ์ ์์๋ ๋ฉ์๋์ ์ ๋ณด์ ์์ธ ๋ฉ์์ง๋ฅผ ํ๋ฉด์ ์ถ๋ ฅ
- getMessage(): ๋ฐ์ํ ์์ธํด๋์ค์ ์ธ์คํด์ค์ ์ ์ฅ๋ ๋ฉ์์ง๋ฅผ ์ป์ ์ ์๋ค.
# 5-3. ๋ฉํฐ catch๋ธ๋ญ
JDK1.7๋ถํฐ ์ฌ๋ฌ catch๋ธ๋ญ์ '|' ๊ธฐํธ๋ฅผ ์ด์ฉํด์ ํ๋์ catch๋ธ๋ญ์ผ๋ก ํฉ์น ์ ์๊ฒ ๋์๋ค.
์ค๋ณต๋ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๊ณ ์ฐ๊ฒฐํ ์ ์๋ ์์ธ ํด๋์ค์ ๊ฐ์์ ์ ํ์ด ์๋ค.
๋ ์์ธ ํด๋์ค๊ฐ ์กฐ์๊ณผ ์์ ๊ด๊ณ๋ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์กฐ์ํด๋์ค๋ง ์จ์ฃผ๋ ๊ฒ๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ผ๋ ์๋ฏธ์ ์๋ฌ๋ค.
# ex) ์ ์ฉ ์
try {
...
}catch (ExceptionA e){
e.printStackTrace();
}catch (ExceptionB e2){
e2.printStackTrace();
}
# ex) ์ ์ฉ ํ
try {
...
}catch (ExceptionA | ExceptionB e){
e.printStackTrace();
}
# 6. finally๋ธ๋ญ
finally๋ธ๋ญ์ try-catch๋ฌธ๊ณผ ํจ๊ป ์์ธ์ ๋ฐ์์ฌ๋ถ์ ์๊ด์์ด ์คํ๋์ด์ผํ ์ฝ๋๋ฅผ ํฌํจ์ํฌ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค. try-catch๋ฌธ ๋์ ์ ํ์ ์ผ๋ก ๋ง๋ถ์ฌ ์ฌ์ฉํ ์ ์๋ค.
# ex) ์์
try {
// ์์ธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฌธ์ฅ๋ค์ ๋ฃ๋๋ค.
...
} catch (Exception e) {
// ์์ธ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฌธ์ฅ์ ์ ๋๋ค.
...
} finally {
// ์์ธ์ ๋ฐ์์ฌ๋ถ์ ๊ด๊ณ์์ด ํญ์ ์ํ๋์ด์ผํ๋ ๋ฌธ์ฅ๋ค์ ๋ฃ๋๋ค.
}
์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ try->catch->finally
์์ผ๋ก ์คํ๋๊ณ ,
์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ try->finally
์์ผ๋ก ์คํ๋๋ค.