์ถ์ฒ
https://stackify.com/best-practices-exceptions-java/
์ด๋ฐ ๊ฒ๋ค์ ์ฃผ์ํด์ผ ํ๋๊ตฌ๋.. ํ๋ ๊ฒ๋ค์ ์ถ์ฒ๋ค์ด์ ์ ๋ฆฌํจ.
1. Be careful what you log. ๋ก๊ทธํ๋ ๊ธฐ๋ก๋ฌผ์ ์ฃผ์ํ๋ผ.
๋ณด์์ ์ด๊ธฐ์ง ์๋ ๋ฒ์์์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํด๋ผ. ์๊ทธ๋ผ ํด๊ณ ๋๋ค.
2. Don’t bury thrown exceptions. ๋ฐ์ํ ์์ธ๋ฅผ ๋ฌป์ด๋์ง ๋ง์๋ผ / Don’t Ignore Exceptions ์์ธ๋ฅผ ๋ฌด์ํ์ง ๋ง๋ผ
์์ธ ๋ฐ์ ์ ์๋ฌด ๊ฒ๋ ์ํ๋ ๊ฒ์ burying an exception(์์ธ ๋ฌป๊ธฐ)๋ผ๊ณ ํ๋ค. ์์ธ๋ฅผ ๋ฌป์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ฌธ์ ํด๊ฒฐ์ด ์ด๋ ค์์ง๋ค.
catch ๋ธ๋ก์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ์ง ์๋ ๊ฒ์ ์์ธ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ด๋ค. ์ด๊ฑด ์์ธ๊ฐ ๋ฐํ์ง ์์ ๊ฒ์ด๋ ์๊ฐ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์์ฑํ์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
์ฝ๋๊ฐ ์์ผ๋ก ์ด๋ป๊ฒ ๋ฐ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ์ธ์งํ์ง ๋ชปํ์ฑ๋ก ๋๊ตฐ๊ฐ๊ฐ ์์ธ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์งํ๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ ์๋ ์๊ฑฐ๋, ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ์์ธ๋ฅผ catchํ์ง ๋ชปํ ์๋ ์๋ค.
์ต์ํ์ผ๋ก ์์ํ ์ ์๋ ์ผ์ด ๋ฐ์ํ์ ๋์ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฅผ ํ์ธํด์ผ ํ๋ค๋ ๊ฒ์ ๋ชจ๋ ์ฌ๋์๊ฒ ์๋ฆฌ๋ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์์ฑํด์ผ ํ๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋น์ ์ด๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ก๊ทธ๋ฅผ ํตํด ์์ธ ์ํฉ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์๋ค.
public void logAnException() {
try {
// do something
} catch (NumberFormatException e) {
log.error("This should never happen: " + e);
}
}
3. Use a global Exception handler. ์ ์ญ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ผ.
๋ฐํ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์ญ ์์ธ ์ฒ๋ฆฌ(handler)๋ฅผ ์ฌ์ฉํด๋ผ.
์ด๋ ๊ฒ ํ๋ฉด ์์ธ๋ฅผ ๊ธฐ๋กํ๊ณ ์ ์ฌ์ ์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ณ , ์์ธ ๋ฐ์ ์ ์ฑ์ด ์ค๋จ๋๋ ๊ฒ์ ๋ง๋๋ค.
4. Don’t close resources manually. ์๋์ผ๋ก ๋ฆฌ์์ค๋ฅผ close ํ์ง ๋ง๋ผ.
try-with-resources, try-catch๋ฅผ ์ฌ์ฉํ๋ผ. JVM์ด ์์์ ์๋ฒฝํ๊ฒ ๋ฆฌ์์ค๋ฅผ ๋ซ๋๋ก ํด๋ผ.
5. Throw early and handle exceptions late. ์์ธ๋ ๋นจ๋ฆฌ throwํ๊ณ ์ฒ๋ฆฌ๋ ๋ฆ๊ฒ ํ๋ผ.
์์ธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ์ ์์ธ๋ฅผ throw ํ๋ผ.
์์ธ๋ฅผ catchํ๋ ํจ์๋ ๋ฉ์๋์ ๋๋ถ๋ถ์ ์์ด์ผ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ์ ์ ์์ catch ๋ธ๋ก์ ์ถ๊ฐํ๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํ๋ค.
6. Don’t log and rethrow Java exceptions.
์์ธ ๋ฐ์ ์
1) ์์ธ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธฐ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ์งํํ๋๊ฐ
2) ์์ธ๋ฅผ ๋ค์ throwํด์ ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์ธ๋ถ์ฌํญ์ ๋ก๊ทธ๋ก ๋จ๊ธฐ๊ฒ ๋ ํ๋ผ
๋ ์ค์ ํ๋๋ง ํด์ผ ํ๋ค.
๋ ๋ค ๊ฐ์ด ํด์๋ ์๋๋ค. ๊ทธ๋ผ ์ฝ๋๊ฐ ์ค๋ณต๋๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต๋ค.
7. Check for suppressed exceptions. suppressed(์ต์ ๋) ์์ธ๋ฅผ ํ์ธํด๋ผ.
suppressed(์ต์ ๋) ์์ธ๋ฅผ ํ์ธํด๋ผ.
try-with-resource ๊ธฐ๋ฅ์ด ๋์ ๋๋ฉด์ ๋์์ ๋ ๊ฐ์ง ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก๋ค.
์์
try ( Door door = new Door() ) {
door.swing(); /* Throws the SwingException */
}
catch (Exception e) {
System.out.println("Primary Exception: " + e.getClass());
if (e.getSuppressed().length > 0) {
System.out.print("Suppressed Exception: " + e.getSuppressed()[0]);
}
}
8. Explicitly define exception in the throws clause. throws ๊ตฌ๋ฌธ์ ์์ธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ๋ผ
throws ๊ตฌ๋ฌธ์์ ๊ตฌ์ฒด์ , ๋ช ์์ ์ผ๋ก ์์ธ๋ฅผ ๊ธฐ์ ํด์, ๊ฐ๋ฐ์๋ค์ด ํน์ ๋ฉ์๋๊ฐ ์ ๋๋ก ์คํ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฃจํด์ ์ ์ ์๊ฒ ํด๋ผ.
9. Catch the most explicit exception first. ๋ช ์์ ์ธ ์์ธ๋ฅผ ๋จผ์ catch ํด๋ผ
๊ตฌ์ฒด์ ์ธ ์์ธ๋ฅผ ๋จผ์ catch ํ๊ณ ๋ ๊ตฌ์ฒด์ ์ธ ์์ธ ์์ผ๋ก catch ํด๋ผ. ์ด ๊ท์น์ ๋ฐ๋ฅด์ง ์์ผ๋ฉด JVM์ ์ดํดํ๊ธฐ ์ด๋ ค์ํ๋ค.
10.Use modern exception handling techniques
Java์์ ์์ธ ์ฒ๋ฆฌ ๊ด๋ จํ ๋ง์ ๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋์ด ์๋ค. ๋จ์ผ catch ๋ธ๋ก์์ ์ฌ๋ฌ ์์ธ๋ฅผ catch ํ๋ ๊ธฐ๋ฅ, try-with-resource ๋ธ๋ก์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก closeํ๋ ๊ธฐ๋ฅ ๋ฑ์ ์ฌ์ฉํด๋ผ.
11.Document the Exceptions You Specify. ์์ธ๋ฅผ ๋ช ์ํ ๊ฒฝ์ฐ(throws ๊ตฌ๋ฌธ ์ธ ๊ฒฝ์ฐ) ๋ฌธ์๋ฅผ ๋จ๊ฒจ๋ผ.
๋ฉ์๋ ์๊ทธ๋์ฒ์ ์์ธ๋ฅผ ๋ช ์ํ ๊ฒฝ์ฐ(throws ๊ตฌ๋ฌธ ์ธ ๊ฒฝ์ฐ) Javadoc์ ์ด์ฉํด ๋ฌธ์๋ฅผ ๋จ๊ฒจ๋ผ.
์์
/**
* This method does something extremely useful ...
*
* @param input
* @throws MyBusinessException if ... happens
*/
public void doSomething(String input) throws MyBusinessException { ... }
12.Throw Exceptions With Descriptive Messages ์ค๋ช ํ๋ ๋ฉ์์ง์ ํจ๊ป ์์ธ๋ฅผ ๋์ ธ๋ผ.
์์ธ๊ฐ ๋ฐ์๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๋๋ก ๋๋ ์ ํํ ์ค๋ช ์ ์ ๊ณตํด์ผ ํ๋ค. 1-2์ค๋ก์งง๊ฒ ์ฐ๋ฉด ๋๋ค. ์ด์ ์ ๋ฌธ์ ์ ์ฌ๊ฐ๋๋ฅผ ์ดํดํ๊ณ ๋ ์ฝ๊ฒ ๋ถ์ํ ์ ์๋ค.
ํน์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋์ค ์ด๋ฆ์ด ์ค๋ฅ ์ข ๋ฅ๋ฅผ ์ค๋ช ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ง์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ ํ์๋ ์๋ค.
13.Don’t Catch Throwable Throwable์ catchํ์ง ๋ง๋ผ.
Throwable์ ๋ชจ๋ ์์ธ์ ์๋ฌ์ ์ํผํด๋์ค์ด๋ค. catch ๊ตฌ๋ฌธ์์ ์ฌ์ฉ ๊ฐ๋ฅ์ ํ์ง๋ง, ์ฌ์ฉํ์ง ๋ง๋ผ.
catch ์ ์ throwable์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ธ ๋ฟ๋ง์ด ์๋๋ผ ์๋ฌ๋ catchํ๋ค.
์๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฒ๋ฆฌํ ์ ์๋ ์ค๋ฅ๋ก JVM์ด ๋ฐ์์ํจ๋ค. OutOfMemoryError, StackOverflowError๊ฐ ์๋ค. ์ด๊ฒ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ๋ผ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฑฐ๋ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ธ์ ์ธ ์ํฉ์ ์ฒํด ์๋ค๋ ํ์ ์ด ์๋ค๋ฉด Throwable์ ์ก์ง ์๋ ๊ฒ์ด ์ข๋ค.