{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2020-10-12--001--04","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"0d20e38e-5cd4-58fd-ba3e-6b94f42f0583","html":"<h2>아이템72) 표준 예외를 사용하라</h2>\n<p>상황에 부합한다면 항상 표준 예외를 사용하자<br>\n더 많은 정보를 제공하길 원한다면 표준 예외를 확장해도 좋지만, 예외는 직렬화 할 수 있다는 사실을 기억하자</p>\n<h3>Exception, RuntimeException, Throwable, Error 는 직접 재사용하지 말자</h3>\n<ul>\n<li>이 예외들은 다른 예외들의 상위 클래스이므로 안정적으로 테스트가 불가능하다.</li>\n</ul>\n<h4>흔하게 재사용되는 예외</h4>\n<table>\n<thead>\n<tr>\n<th>예외</th>\n<th>주요쓰임</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>IllegalArgumentException</td>\n<td>허용하지 않는 값이 인수로 건네졌을 때(null은 따로 NullPointerException으로 처리)</td>\n</tr>\n<tr>\n<td>IllegalStateException</td>\n<td>args가 무엇이든 객체가 메서드를 수행하기에 적절하지 않은 상태일 때</td>\n</tr>\n<tr>\n<td>NullPointerException</td>\n<td>null을 허용하지 않는 메서드에 null을 건넸을 때</td>\n</tr>\n<tr>\n<td>IndexOutOfBoundsException</td>\n<td>인덱스가 범위를 넘어섰을 때</td>\n</tr>\n<tr>\n<td>ConcurrentModificationException</td>\n<td>허용하지 않는 동시 수정이 발견됐을 때</td>\n</tr>\n<tr>\n<td>UnSupportedOperationException</td>\n<td>호출한 메서드를 지원하지 않을 때</td>\n</tr>\n</tbody>\n</table>\n<h4>java exceptions handling mechanism</h4>\n<ul>\n<li>\n<p>All-in-one Catch\n— 항상 try 문 안에서 던져질 수 있는 특정 예외들에 해당하는 것들을 캐치하도록 하는 것이 좋다.<br>\n이런 방식은 우리가 각 예외타입별 다른 방식으로 예외를 핸들 할 수 있는 가능성을 제공 한다.\n아무런 조치를 취할 수 없다면, RuntimeException 을 통해 변환하는게 좋을 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">method</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span>\n<span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>ref) <a href=\"https://m.blog.naver.com/PostView.nhn?blogId=sthwin&#x26;logNo=220846528466&#x26;targetKeyword=&#x26;targetRecommendationCode=1\">https://m.blog.naver.com/PostView.nhn?blogId=sthwin&#x26;logNo=220846528466&#x26;targetKeyword=&#x26;targetRecommendationCode=1</a></p>\n</li>\n</ul>\n<h4>Best Practices for Custom Exceptions</h4>\n<ol>\n<li>Always Provide a Benefit<br>\n— 자바의 표준 예외들에 포함되지 않는 정보나 기능을 제공하지 않는 한 표준 예외를 사용하라</li>\n<li>Follow the Naming Convention<br>\n— 표준 예외 클래스는 모두 Exception 으로 끝난다</li>\n<li>Provide Javadoc Comments for Your Exception Class<br>\n— Javadoc은 예외가 발생할 수도 있는 상황과 예외의 일반적인 의미를 기술한다.<br>\n목적은 다른 개발자들이 여러분의 API를 이해하도록 하고 일반적인 에러상황들을 피하도록 돕는것이다  </li>\n<li>Provide a Constructor That Sets the Cause<br>\n— 커스텀 예외를 던지기 전에 표준예외을 캐치하는 케이스가 꽤 많다.<br>\n보통 캐치된 예외에는 제품에 발생한 오류를 분석하는데 필요한 중요한 정보가 포함되어 있다.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">wrapException</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> input<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">MyBusinessException</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// do something</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">NumberFormatException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// set 'e (Throwable)'</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">MyBusinessException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"A message that describes the error.\"</span><span class=\"token punctuation\">,</span> e<span class=\"token punctuation\">,</span> <span class=\"token class-name\">ErrorCode</span><span class=\"token punctuation\">.</span>INVALID_PORT_CONFIGURATION<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>ref) <a href=\"https://m.blog.naver.com/PostView.nhn?blogId=sthwin&#x26;logNo=221144722072&#x26;proxyReferer=https:%2F%2Fwww.google.com%2F\">https://m.blog.naver.com/PostView.nhn?blogId=sthwin&#x26;logNo=221144722072&#x26;proxyReferer=https:%2F%2Fwww.google.com%2F</a></p>","fields":{"tagSlugs":["/tags/책리뷰/","/tags/이펙티브자바/"],"slug":"/history/posts/2020-10-12--001--04"},"frontmatter":{"title":"[책리뷰/Effective Java] 예외","tags":["책리뷰","이펙티브자바"],"date":"2020-10-12","description":"아이템72) 표준 예외를 사용하라"}}},"pageContext":{"slug":"/history/posts/2020-10-12--001--04"}},"staticQueryHashes":[]}