René's URL Explorer Experiment


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

direct link

Domain: patch-diff.githubusercontent.com


Hey, it has json ld scripts:
{"@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-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:ca25077b-3485-89de-2656-21092af6f861
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idC8AE:2CF5C1:B73280:F7C1A9:696E87DB
html-safe-nonce635e56b206b4b02cb631772063331274c6177fb0326c778a746541932cd29266
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDOEFFOjJDRjVDMTpCNzMyODA6RjdDMUE5OjY5NkU4N0RCIiwidmlzaXRvcl9pZCI6IjYyMDI1NjA4MDg3ODU3MDkwMjAiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac9e6cc38088a6da540f6f6cd7cd267a7d3a88ddb9d3000c1385677e3d5ec86b03
hovercard-subject-tagissue:1640945590
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/Study-2-Effective-Java/Effective-Java/181/issue_layout
twitter:imagehttps://opengraph.githubassets.com/93c39949da6b3a1123b99aba18fd1db9c774b39ede25de329bc61da4a7b3a999/Study-2-Effective-Java/Effective-Java/issues/181
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/93c39949da6b3a1123b99aba18fd1db9c774b39ede25de329bc61da4a7b3a999/Study-2-Effective-Java/Effective-Java/issues/181
og:image:altDiscussed 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:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernameIrisation23
hostnamegithub.com
expected-hostnamegithub.com
Nonefdad15fd2ad43212aa8b8be5f2c2725550f8374ceeeb154a999ad9145b43f3f7
turbo-cache-controlno-preview
go-importgithub.com/Study-2-Effective-Java/Effective-Java git https://github.com/Study-2-Effective-Java/Effective-Java.git
octolytics-dimension-user_id120388640
octolytics-dimension-user_loginStudy-2-Effective-Java
octolytics-dimension-repository_id577325341
octolytics-dimension-repository_nwoStudy-2-Effective-Java/Effective-Java
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id577325341
octolytics-dimension-repository_network_root_nwoStudy-2-Effective-Java/Effective-Java
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release27b23bc056eb973d350fc95afc848757edb9e7a9
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#start-of-content
https://patch-diff.githubusercontent.com/
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2FStudy-2-Effective-Java%2FEffective-Java%2Fissues%2F181
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2FStudy-2-Effective-Java%2FEffective-Java%2Fissues%2F181
Sign up https://patch-diff.githubusercontent.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=Study-2-Effective-Java%2FEffective-Java
Reloadhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181
Reloadhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181
Reloadhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181
Study-2-Effective-Java https://patch-diff.githubusercontent.com/Study-2-Effective-Java
Effective-Javahttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java
Notifications https://patch-diff.githubusercontent.com/login?return_to=%2FStudy-2-Effective-Java%2FEffective-Java
Fork 3 https://patch-diff.githubusercontent.com/login?return_to=%2FStudy-2-Effective-Java%2FEffective-Java
Star 8 https://patch-diff.githubusercontent.com/login?return_to=%2FStudy-2-Effective-Java%2FEffective-Java
Code https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java
Issues 59 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues
Pull requests 0 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/pulls
Discussions https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions
Actions https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/actions
Projects 0 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/projects
Security Uh oh! There was an error while loading. Please reload this page. https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/security
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181
Insights https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/pulse
Code https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java
Issues https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues
Pull requests https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/pulls
Discussions https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions
Actions https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/actions
Projects https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/projects
Security https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/security
Insights https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/pulse
New issuehttps://patch-diff.githubusercontent.com/login?return_to=https://github.com/Study-2-Effective-Java/Effective-Java/issues/181
New issuehttps://patch-diff.githubusercontent.com/login?return_to=https://github.com/Study-2-Effective-Java/Effective-Java/issues/181
아이템 73. 추상화 수준에 맞는 예외를 던지라 - Finhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#top
https://patch-diff.githubusercontent.com/Irisation23
10장 예외이펙티브 자바 10장 (예외)https://github.com/Study-2-Effective-Java/Effective-Java/issues?q=state%3Aopen%20label%3A%2210%EC%9E%A5%20%EC%98%88%EC%99%B8%22
https://github.com/Irisation23
https://github.com/Irisation23
Irisation23https://github.com/Irisation23
on Mar 26, 2023https://github.com/Study-2-Effective-Java/Effective-Java/issues/181#issue-1640945590
https://github.com/orgs/Study-2-Effective-Java/discussions/172https://github.com/orgs/Study-2-Effective-Java/discussions/172
0. TL;DR 📚https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#0-tl-dr---
1. 잘못 처리된 예외https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#1----------
2. 예외 번역(Exception Translation)https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#2-------exception-translation-
3. 예외 연쇄(exception chanining)https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#3-------exception-chanining-
3.1 차선책https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#31----
4. 최종 정리 📚https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#4---------
5. 회고 🧹https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/issues/181#5------
Table of contents generated with markdown-tochttp://ecotrust-canada.github.io/markdown-toc/
아이템 49. 매개변수가 유효한지 검사하라 #114https://github.com/orgs/Study-2-Effective-Java/discussions/114
https://user-images.githubusercontent.com/53285909/227783504-d657be6e-b29d-492d-a8f0-b6595261e139.png
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.mdhttps://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
https://data-flair.training/blogs/java-exception/https://data-flair.training/blogs/java-exception/
Irisation23https://patch-diff.githubusercontent.com/Irisation23
10장 예외이펙티브 자바 10장 (예외)https://github.com/Study-2-Effective-Java/Effective-Java/issues?q=state%3Aopen%20label%3A%2210%EC%9E%A5%20%EC%98%88%EC%99%B8%22
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.