Title: 아이템 73. 추상화 수준에 맞는 예외를 던지라 - Fin · Issue #181 · Study-2-Effective-Java/Effective-Java · GitHub
Open Graph Title: 아이템 73. 추상화 수준에 맞는 예외를 던지라 - Fin · Issue #181 · Study-2-Effective-Java/Effective-Java
X Title: 아이템 73. 추상화 수준에 맞는 예외를 던지라 - Fin · Issue #181 · Study-2-Effective-Java/Effective-Java
Description: Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/172 Originally posted by bunsung92 March 21, 2023 📝 구성 0. TL;DR 📚 1. 잘못 처리된 예외 2. 예외 번역(Exception Translation) 3. 예외 연쇄(exception chanining) 3.1 차선책 4. 최종 정리 📚 5. 회고...
Open Graph Description: Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/172 Originally posted by bunsung92 March 21, 2023 📝 구성 0. TL;DR 📚 1. 잘못 처리된 예외 2. 예외 번역(Exception Translation) 3. 예외 연쇄(excep...
X Description: Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/172 Originally posted by bunsung92 March 21, 2023 📝 구성 0. TL;DR 📚 1. 잘못 처리된 예외 2. 예외 번역(Exception Translation) 3. 예외 연쇄(excep...
Opengraph URL: https://github.com/Study-2-Effective-Java/Effective-Java/issues/181
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"아이템 73. 추상화 수준에 맞는 예외를 던지라 - Fin","articleBody":"### Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/172\r\n\r\n\u003cdiv type='discussions-op-text'\u003e\r\n\r\n\u003csup\u003eOriginally posted by **bunsung92** March 21, 2023\u003c/sup\u003e\r\n📝 구성\r\n\r\n- [0. TL;DR 📚](#0-tl-dr---)\r\n- [1. 잘못 처리된 예외](#1----------)\r\n- [2. 예외 번역(Exception Translation)](#2-------exception-translation-)\r\n- [3. 예외 연쇄(exception chanining)](#3-------exception-chanining-)\r\n * [3.1 차선책](#31----)\r\n- [4. 최종 정리 📚](#4---------)\r\n- [5. 회고 🧹](#5------)\r\n\r\n\u003csmall\u003e\u003ci\u003e\u003ca href='http://ecotrust-canada.github.io/markdown-toc/'\u003eTable of contents generated with markdown-toc\u003c/a\u003e\u003c/i\u003e\u003c/small\u003e\r\n\r\n---\r\n\r\n# 0. TL;DR 📚\r\n\r\n- 아래 계층의 예외 처리가 어렵고, 그 예외를 상위 계층을 통해 노출한다면 예외 번역을 사용하라.\r\n- 예외 연쇄를 이용하면 상위 계층에는 맥락에 어울리는 고수준 예외를 던지면서 근본 원인도 함께 알려주어 오류 분석에 도움이 된다.\r\n\r\n\u003e 예외 번역? 예외 연쇄?\r\n\r\n---\r\n\r\n# 1. 잘못 처리된 예외\r\n\r\n- 메서드가 저수준 예외를 처리하지 않고, 바깥으로 전파하는 경우 (발생 위치에서 예외 처리하지 않는 경우를 말함) 에 대한 문제 발생\r\n - 수행하려는 일과 관련없는 예외가 발생할 수있다.\r\n - 구현 방식을 바꾸면 또 다른 예외를 발생시켜 기존 클라이언트 프로그램을 깨뜨릴 수 있다.\r\n\r\n---\r\n\r\n# 2. 예외 번역(Exception Translation)\r\n\r\n위와 같은 상황에서의 해결책으로 제시 될 수 있는 방법이다.\r\n\r\n- 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다.\r\n\r\n``` java\r\npublic abstract class AbstractSequentialList\u003cE\u003e extends AbstractList\u003cE\u003e {\r\n \r\n /**\r\n * Returns the element at the specified position in this list.\r\n *\r\n * @param index index of the element to return\r\n * @return the element at the specified position in this list\r\n * @throws IndexOutOfBoundsException if the index is out of range\r\n * (index \u003c 0 || index \u003e= size())\r\n */\r\n public E get(int index) {\r\n try {\r\n return listIterator(index).next();\r\n } catch (NoSuchElementException exc) {\r\n throw new IndexOutOfBoundsException(\"Index: \"+index);\r\n }\r\n }\r\n}\r\n```\r\n\r\n- 예외 번역시 저수준 예외가 디버깅에 도움이 된다면 `예외 연쇄(exception chanining)`을 사용하는게 좋다.\r\n\r\n---\r\n\r\n# 3. 예외 연쇄(exception chanining)\r\n\r\n문제의 근본 원인(cause)인 저수준 예외를 고수준 예외에 실어 보내는 방식이다.\r\n\r\n\u003e 예외 연쇄라는 용어를 보다 더 쉽게 이해하기에 좋은 방법은 `상승`이라는 키워드를 생각 해 보는게 좋을것 같다.\r\n\u003e 저수준 -\u003e 고수준\r\n\u003e 보다 더 추상화된 클래스에서의 예외 처리등을 키워드로 잡을 수 있다.\r\n\r\n- 별도의 접근자 메서드(Throwable 의 getCause()) 를 통해 필요하다면 언제든 저수준 예외를 꺼내 볼 수 있다.\r\n\r\n``` java\r\nclass HigherLevelException extends Exception {\r\n HigherLevelException(Throwable cause) {\r\n super(cause);\r\n }\r\n}\r\n\r\nclass ChildClass {\r\n public void publicAPIMethod() {\r\n try {\r\n //do somthing...\r\n } catch (LowerLevelException cause) {\r\n throw new HigherLevelException(cause);\r\n }\r\n }\r\n}\r\n```\r\n\r\n- 대부분의 표준 예외는 예외 연쇄용 생성자를 갖고 있다.\r\n- 예외 연쇄는 문제의 원인을 (getCause 메서드) 프로그램에서 접근할 수 있게 해주며, 원인과 고수준 예외의 스택 추적 정보 통합을 해준다.\r\n- 예외를 전파하는 것보다 예외 번역하는 것이 `우수한 방법` 이지만 남용해서는 안된다.\r\n- 가능하다면 저수준 메서드는 예외를 발생하지 않도록 하는것이 최선이다.\r\n- 때로는 `상위 계층 메서드` 의 매개변수 값을 아래 계층 메서드로 건내기 전에 미리 검사하는 방법으로 목적을 달성할 수 있다.(#114 )\r\n\r\n## 3.1 차선책\r\n\r\n- 아래 계층에서의 예외를 피할 수 없다면, 상위 계층에서 그 예외를 조용히 처리하여 문제를 API 호출자에게 전파하지 않는 방법이 있다.\r\n- 상위 계층에서 해당 처리를 이었다면 로깅을 통해 기록하는게 좋다.\r\n- 클라이언트 코드와 사용자에게 문제를 전파하지 않으면서 프로그래머가 로그를 분석해 추가 조치를 취할 수 있도록 해주기 때문이다.\r\n\r\n\u003cimg width=\"639\" alt=\"image\" src=\"https://user-images.githubusercontent.com/53285909/227783504-d657be6e-b29d-492d-a8f0-b6595261e139.png\"\u003e\r\n\r\n---\r\n\r\n# 4. 최종 정리 📚\r\n\r\n그래서 추상화 수준에 맞는 예외는 무엇일까? 🤔\r\n\r\n- `예외 번역`과 `예외 연쇄`를 고려한 예외의 처리이다.\r\n- `예외 번역`은 저수준 예외를 처리하고 있는 자신(this) 수준에 맞는 예외로 바꿔 던지는 것이다.\r\n- `예외 연쇄`는 문제의 원인(cause) 저수준 예외를 고수준 예외에 실어 보내는 방식이다.\r\n\r\n ---\r\n\r\n# 5. 회고 🧹\r\n\r\n2023-03-26 일\r\n\r\n- 고수준, 저수준, 예외 번역, 예외 연쇄 등등 용어가 쉽지않은 파트였다.\r\n- 원인을 던져주냐가 예외 번역과 예외 연쇄를 구분 지어주는 포인트라 생각 할 수 있는것 같다.\r\n- 예외를 다루는 일은 언제나 중요하며, 로깅하는 습관 역시 뼈에 박아야 한다고 생각한다.\r\n- 따라서, 진행될 프로젝트에는 예외도 상황에 맞게, 원하는 예외 처리를 할 수 있도록 노력해야겠다.\r\n\r\n---\r\n\r\n\u003e 출처\r\n\u003e \u003e https://github.com/Meet-Coder-Study/book-effective-java/blob/main/10%EC%9E%A5/73_%EC%B6%94%EC%83%81%ED%99%94_%EC%88%98%EC%A4%80%EC%97%90_%EB%A7%9E%EB%8A%94_%EC%98%88%EC%99%B8%EB%A5%BC_%EB%8D%98%EC%A0%B8%EB%9D%BC_%EA%B9%80%EC%84%9D%EB%9E%98.md\r\n\u003e \u003e https://data-flair.training/blogs/java-exception/\u003c/div\u003e","author":{"url":"https://github.com/Irisation23","@type":"Person","name":"Irisation23"},"datePublished":"2023-03-26T14:59:11.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/181/Effective-Java/issues/181"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:ca25077b-3485-89de-2656-21092af6f861 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C8AE:2CF5C1:B73280:F7C1A9:696E87DB |
| html-safe-nonce | 635e56b206b4b02cb631772063331274c6177fb0326c778a746541932cd29266 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDOEFFOjJDRjVDMTpCNzMyODA6RjdDMUE5OjY5NkU4N0RCIiwidmlzaXRvcl9pZCI6IjYyMDI1NjA4MDg3ODU3MDkwMjAiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 9e6cc38088a6da540f6f6cd7cd267a7d3a88ddb9d3000c1385677e3d5ec86b03 |
| hovercard-subject-tag | issue:1640945590 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/Study-2-Effective-Java/Effective-Java/181/issue_layout |
| twitter:image | https://opengraph.githubassets.com/93c39949da6b3a1123b99aba18fd1db9c774b39ede25de329bc61da4a7b3a999/Study-2-Effective-Java/Effective-Java/issues/181 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/93c39949da6b3a1123b99aba18fd1db9c774b39ede25de329bc61da4a7b3a999/Study-2-Effective-Java/Effective-Java/issues/181 |
| og:image:alt | Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/172 Originally posted by bunsung92 March 21, 2023 📝 구성 0. TL;DR 📚 1. 잘못 처리된 예외 2. 예외 번역(Exception Translation) 3. 예외 연쇄(excep... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | Irisation23 |
| hostname | github.com |
| expected-hostname | github.com |
| None | fdad15fd2ad43212aa8b8be5f2c2725550f8374ceeeb154a999ad9145b43f3f7 |
| turbo-cache-control | no-preview |
| go-import | github.com/Study-2-Effective-Java/Effective-Java git https://github.com/Study-2-Effective-Java/Effective-Java.git |
| octolytics-dimension-user_id | 120388640 |
| octolytics-dimension-user_login | Study-2-Effective-Java |
| octolytics-dimension-repository_id | 577325341 |
| octolytics-dimension-repository_nwo | Study-2-Effective-Java/Effective-Java |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 577325341 |
| octolytics-dimension-repository_network_root_nwo | Study-2-Effective-Java/Effective-Java |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 27b23bc056eb973d350fc95afc848757edb9e7a9 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width