Repository: GideokKim/google-python-style-guide-kr
Pull request #110: docs: [exceptions] 번역 추가
Author: login: codingorijazz
Created: 2025-03-04T07:50:57Z | Merged: 2025-03-09T13:03:05Z

Resolves #14 

-예외 처리 관련 문서 번역 완료
예외는 신중하게 사용해야 하며, 너무 남발하면 코드 흐름이 복잡해질 수 있음.
except: 같은 광범위한 예외 처리는 피하고, 특정 예외만 잡도록 해야 함.
try/except 블록을 최소화하고, finally 블록을 활용하여 정리 작업을 수행하는 것이 좋음."

Linked issue #14: [Translation] `2.4 Exceptions`
[2.4 Exceptions](https://google.github.io/styleguide/pyguide.html#s2.4-exceptions)를 이해하고 한글로 번역합니다.

### 요구 사항

- 기존에 번역된 문서에서 사용한 단어들을 참고하여 번역
- 번역된 문서가 적절한 위치에 표시
  - [mkdocs.yml](https://github.com/GideokKim/google-python-style-guide-kr/blob/main/mkdocs.yml) 참고
  - [Google Python Style Guide - 한글 번역](https://gideokkim.github.io/google-python-style-guide-kr/) 참고

Linked issue comments: user: login: codingorijazz
created_at: 2025-02-28T00:09:42Z
body: 안녕하세요 기덕님! 제가 이것을 해봐도 될까요! ㅎㅎ
author_association: CONTRIBUTOR
user: login: GideokKim
created_at: 2025-02-28T00:21:42Z
body: assignee 지정해드렸습니다! 감사합니다ㅎㅎ
author_association: OWNER

Diff:
diff --git a/google python style guide/exceptions.md b/google python style guide/exceptions.md
new file mode 100644
index 0000000..9bd4b1a
--- /dev/null
+++ b/google python style guide/exceptions.md	
@@ -0,0 +1,84 @@
+## 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+### 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+### 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+### 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+### 2.4.4 권장사항
+
+예외는 특정 조건을 따라야 합니다:
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. 즉, `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+# Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+# No(주의):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+    """
+    assert minimum >= 1024, '최소 포트 번호는 적어도 1024 이상이어야 합니다.'
+    # 아래 코드가 이전 `assert`에 의존합니다.
+    port = self._find_next_open_port(minimum)
+    assert port is not None
+    # 반환문(return statement)에 대한 타입 검사가 `assert`에 의존합니다.
+    return port
+```
+
+- 라이브러리나 패키지는 자체적인 예외를 정의할 수 있습니다. 이때 반드시 기존 예외 클래스를 상속해야 합니다. 예외 클래스의 이름은 `Error`로 끝나야 하며, `foo.FooError`처럼 불필요한 반복을 포함해서는 안 됩니다.
+
+* 포괄적으로 모든 예외를 잡는 `except:` 문이나 `Exception`, `StandardError`를 사용하지 않습니다. 다만, 다음과 같은 경우에는 예외적으로 허용됩니다.
+
+  - 예외를 다시 발생시키는 경우(re-raising the exception)
+  - 예외가 전파되지 않고 기록되거나 무시되도록 하는 격리 지점을 만드는 경우. 예를 들어, 프로그램의 특정 부분이 예외로 인해 중단되지 않도록 보호하는 용도로 사용할 수 있습니다.  
+    (예: 스레드의 최상위 블록을 감싸 충돌을 방지하는 경우)
+
+Python은 이 부분에서 매우 관대하며, `except:`문은 오타가 난 변수명, sys.exit() 호출, Ctrl+C 인터럽트, unittest 실패 등 원하지 않는 다양한 예외까지 처리할 수 있습니다.
+
+- `try`/`except` 블록 내의 코드 양을 최소화합니다. `try` 블록이 커질수록, 예상치 못한 코드에서 예외가 발생할 가능성이 높아지며, 이 경우 실제 오류를 숨길 위험이 있습니다.
+- `try` 블록에서 예외 발생 여부와 관계없이 특정 코드를 실행하려면 `finally` 블록을 사용합니다. 이는 파일 닫기와 같은 정리(cleanup) 작업을 수행할 때 유용합니다.
diff --git a/mkdocs.yml b/mkdocs.yml
index 27b9dd9..e6f3bc9 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -88,6 +88,7 @@ nav:
     - Lint: lint.md
     - Imports: imports.md
     - Packages: packages.md
+    - Exceptions: exceptions.md
     - Mutable Global State: mutable-global-state.md
     - Inner Classes and Functions: Inner_Classes_and_Functions.md
     - Comprehensions & Generator Expressions: comprehensions-&-generator-expressions.md


Reviews:
user: login: GideokKim
body: `mkdocs.yml` 파일에 @codingorijazz 님이 추가해주신 md가 보일 수 있게 넣어줘야 합니다! 확인해주세요!
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-04T08:01:57Z
user: login: Yoonsoyoung02
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-04T08:22:49Z
user: login: codingorijazz
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T08:27:47Z
user: login: codingorijazz
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T08:28:52Z
user: login: Yoonsoyoung02
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-04T09:14:54Z
user: login: Yoonsoyoung02
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-03-04T09:15:29Z
user: login: GideokKim
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-04T10:19:49Z
user: login: gemini-code-assist[bot]
body: ## Code Review
This pull request adds a Korean translation of the Exceptions section of the Google Python Style Guide. The translation appears to be well-done and the changes to `mkdocs.yml` correctly integrate the new document into the site's navigation. Here are a few suggestions for improvement.

### Merge Readiness
The pull request is in good shape to be merged. The translation seems accurate, and the addition to the navigation is correct. I am unable to directly approve the pull request, and recommend that others review and approve this code before merging.
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-05T00:09:12Z
user: login: gemini-code-assist[bot]
body: ## Code Review
This pull request adds a Korean translation of the exceptions section of the Google Python Style Guide. The translation appears to be well-written and accurate. The addition of the Exceptions section to the `mkdocs.yml` file ensures that it will be included in the generated documentation.

### Merge Readiness
The pull request appears to be ready for merging. The translation is well-written and accurate, and the addition to `mkdocs.yml` ensures that the translated document will be included in the generated documentation. I am unable to directly approve the pull request, and recommend that others review and approve this code before merging.
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-05T00:11:29Z
user: login: GideokKim
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-08T03:06:45Z
user: login: GideokKim
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-08T03:07:34Z
user: login: GideokKim
state: COMMENTED
author_association: OWNER
submitted_at: 2025-03-08T07:06:13Z
user: login: Yoonsoyoung02
body: 저도 수정 의견 하나 남겨두었는데 확인 한 번 부탁드려요! :)
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-08T08:47:59Z
user: login: codingorijazz
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-09T03:30:12Z
user: login: codingorijazz
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-09T03:30:19Z

Review comments:
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
path: google python style guide/exceptions.md
user: login: GideokKim
body: ```suggestion
예외는 특정 조건을 따라야 합니다:
```
created_at: 2025-03-04T07:57:39Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
path: google python style guide/exceptions.md
user: login: GideokKim
body: 주석으로 변경해주세요!

```suggestion
# Yes(권장):
```
created_at: 2025-03-04T07:58:18Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
path: google python style guide/exceptions.md
user: login: GideokKim
body: ```suggestion
# No(주의):
```
created_at: 2025-03-04T07:59:53Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+    """
+    assert minimum >= 1024, '최소 포트 번호는 적어도 1024 이상이어야 합니다.'
+    # 아래 코드가 이전 `assert`에 의존합니다.
+    port = self._find_next_open_port(minimum)
+    assert port is not None
+    # 반환문(return statement)에 대한 타입 검사가 `assert`에 의존합니다.
+    return port
+```
+
+- 라이브러리나 패키지는 자체적인 예외를 정의할 수 있습니다. 이때 반드시 기존 예외 클래스를 상속해야 합니다. 예외 클래스의 이름은 `Error`로 끝나야 하며, `foo.FooError`처럼 불필요한 반복을 포함해서는 안 됩니다.
+
+* 포괄적으로 모든 예외를 잡는 `except:` 문이나 `Exception`, `StandardError`를 사용하지 않습니다. 다만, 다음과 같은 경우에는 예외적으로 허용됩니다.
+
+  - 예외를 다시 발생시키는 경우(re-raising the exception)
+  - 예외가 전파되지 않고 기록되거나 무시되도록 하는 격리 지점을 만드는 경우. 예를 들어, 프로그램의 특정 부분이 예외로 인해 중단되지 않도록 보호하는 용도로 사용할 수 있습니다.  
+    (예: 스레드의 최상위 블록을 감싸 충돌을 방지하는 경우)
+
+Python은 이 부분에서 매우 관대하며, `except:`문은 오타가 난 변수명, sys.exit() 호출, Ctrl+C 인터럽트, unittest 실패 등 원하지 않는 다양한 예외까지 처리할 수 있습니다.
+
+- `try`/`except` 블록 내의 코드 양을 최소화합니다. `try` 블록이 커질수록, 예상치 못한 코드에서 예외가 발생할 가능성이 높아지며, 이 경우 실제 오류를 숨길 위험이 있습니다.
+- 예외 발생 여부와 관계없이 특정 코드를 실행하려면 `finally` 블록을 사용합니다. 이는 파일 닫기와 같은 정리(cleanup) 작업을 수행할 때 유용합니다.
path: google python style guide/exceptions.md
user: login: Yoonsoyoung02
body: 원문에서 아래와 같이 서술되어 있는데요,
"Use the finally clause to execute code whether or not an exception is raised **in the try block**."

해석한 문장의 가장 앞에' `try` 블록에서' 라는 표현이 추가되면 좋을 것 같습니다. :)

[수정]
`try` 블록에서 예외 발생 여부와 관계없이 특정 코드를 실행하려면 `finally` 블록을 사용합니다. ~
created_at: 2025-03-04T08:21:25Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
path: google python style guide/exceptions.md
user: login: Yoonsoyoung02
body: [현재]
" `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다."

[수정]
"즉, `assert` 조건문은~" 으로 문장을 수정하면 조금 더 매끄럽게 읽힐 것 같습니다! 👍 
created_at: 2025-03-04T08:22:44Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+    """
+    assert minimum >= 1024, '최소 포트 번호는 적어도 1024 이상이어야 합니다.'
+    # 아래 코드가 이전 `assert`에 의존합니다.
+    port = self._find_next_open_port(minimum)
+    assert port is not None
+    # 반환문(return statement)에 대한 타입 검사가 `assert`에 의존합니다.
+    return port
+```
+
+- 라이브러리나 패키지는 자체적인 예외를 정의할 수 있습니다. 이때 반드시 기존 예외 클래스를 상속해야 합니다. 예외 클래스의 이름은 `Error`로 끝나야 하며, `foo.FooError`처럼 불필요한 반복을 포함해서는 안 됩니다.
+
+* 포괄적으로 모든 예외를 잡는 `except:` 문이나 `Exception`, `StandardError`를 사용하지 않습니다. 다만, 다음과 같은 경우에는 예외적으로 허용됩니다.
+
+  - 예외를 다시 발생시키는 경우(re-raising the exception)
+  - 예외가 전파되지 않고 기록되거나 무시되도록 하는 격리 지점을 만드는 경우. 예를 들어, 프로그램의 특정 부분이 예외로 인해 중단되지 않도록 보호하는 용도로 사용할 수 있습니다.  
+    (예: 스레드의 최상위 블록을 감싸 충돌을 방지하는 경우)
+
+Python은 이 부분에서 매우 관대하며, `except:`문은 오타가 난 변수명, sys.exit() 호출, Ctrl+C 인터럽트, unittest 실패 등 원하지 않는 다양한 예외까지 처리할 수 있습니다.
+
+- `try`/`except` 블록 내의 코드 양을 최소화합니다. `try` 블록이 커질수록, 예상치 못한 코드에서 예외가 발생할 가능성이 높아지며, 이 경우 실제 오류를 숨길 위험이 있습니다.
+- 예외 발생 여부와 관계없이 특정 코드를 실행하려면 `finally` 블록을 사용합니다. 이는 파일 닫기와 같은 정리(cleanup) 작업을 수행할 때 유용합니다.
path: google python style guide/exceptions.md
user: login: codingorijazz
body: 감사합니다! 수정하겠습니다! ㅎㅎ
created_at: 2025-03-04T08:27:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
path: google python style guide/exceptions.md
user: login: codingorijazz
body: 감사합니다!ㅎㅎㅎ
created_at: 2025-03-04T08:28:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+    """
+    assert minimum >= 1024, '최소 포트 번호는 적어도 1024 이상이어야 합니다.'
+    # 아래 코드가 이전 `assert`에 의존합니다.
+    port = self._find_next_open_port(minimum)
+    assert port is not None
+    # 반환문(return statement)에 대한 타입 검사가 `assert`에 의존합니다.
+    return port
+```
+
+- 라이브러리나 패키지는 자체적인 예외를 정의할 수 있습니다. 이때 반드시 기존 예외 클래스를 상속해야 합니다. 예외 클래스의 이름은 `Error`로 끝나야 하며, `foo.FooError`처럼 불필요한 반복을 포함해서는 안 됩니다.
+
+* 포괄적으로 모든 예외를 잡는 `except:` 문이나 `Exception`, `StandardError`를 사용하지 않습니다. 다만, 다음과 같은 경우에는 예외적으로 허용됩니다.
+
+  - 예외를 다시 발생시키는 경우(re-raising the exception)
+  - 예외가 전파되지 않고 기록되거나 무시되도록 하는 격리 지점을 만드는 경우. 예를 들어, 프로그램의 특정 부분이 예외로 인해 중단되지 않도록 보호하는 용도로 사용할 수 있습니다.  
+    (예: 스레드의 최상위 블록을 감싸 충돌을 방지하는 경우)
+
+Python은 이 부분에서 매우 관대하며, `except:`문은 오타가 난 변수명, sys.exit() 호출, Ctrl+C 인터럽트, unittest 실패 등 원하지 않는 다양한 예외까지 처리할 수 있습니다.
+
+- `try`/`except` 블록 내의 코드 양을 최소화합니다. `try` 블록이 커질수록, 예상치 못한 코드에서 예외가 발생할 가능성이 높아지며, 이 경우 실제 오류를 숨길 위험이 있습니다.
+- 예외 발생 여부와 관계없이 특정 코드를 실행하려면 `finally` 블록을 사용합니다. 이는 파일 닫기와 같은 정리(cleanup) 작업을 수행할 때 유용합니다.
path: google python style guide/exceptions.md
user: login: Yoonsoyoung02
body: 수고 많으셨습니다 규호님 👍👍
created_at: 2025-03-04T09:14:54Z
author_association: COLLABORATOR
diff_hunk: @@ -87,6 +87,6 @@ nav:
     - Lint: lint.md
     - Imports: imports.md
     - Packages: packages.md
+    - Exceptions: exceptions.md
     - Mutable Global State: mutable-global-state.md
-    - Comprehensions & Generator Expressions: comprehensions-&-generator-expressions.md
-    - Default Iterators and Operators: default-iterators-and-operators.md
path: mkdocs.yml
user: login: GideokKim
body: `Default Iterators and Operators: default-iterators-and-operators.md`는 삭제하시면 안됩니다!
created_at: 2025-03-04T10:19:46Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다:
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. 즉, `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+    """
+    assert minimum >= 1024, '최소 포트 번호는 적어도 1024 이상이어야 합니다.'
+    # 아래 코드가 이전 `assert`에 의존합니다.
+    port = self._find_next_open_port(minimum)
+    assert port is not None
+    # 반환문(return statement)에 대한 타입 검사가 `assert`에 의존합니다.
+    return port
+```
+
+- 라이브러리나 패키지는 자체적인 예외를 정의할 수 있습니다. 이때 반드시 기존 예외 클래스를 상속해야 합니다. 예외 클래스의 이름은 `Error`로 끝나야 하며, `foo.FooError`처럼 불필요한 반복을 포함해서는 안 됩니다.
+
+* 포괄적으로 모든 예외를 잡는 `except:` 문이나 `Exception`, `StandardError`를 사용하지 않습니다. 다만, 다음과 같은 경우에는 예외적으로 허용됩니다.
+
+  - 예외를 다시 발생시키는 경우(re-raising the exception)
+  - 예외가 전파되지 않고 기록되거나 무시되도록 하는 격리 지점을 만드는 경우. 예를 들어, 프로그램의 특정 부분이 예외로 인해 중단되지 않도록 보호하는 용도로 사용할 수 있습니다.  
+    (예: 스레드의 최상위 블록을 감싸 충돌을 방지하는 경우)
path: google python style guide/exceptions.md
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

It might be helpful to rephrase this to be more concise and direct. Consider something like: "Avoid broad `except:` clauses. Use them only when re-raising exceptions or creating isolation points to prevent program crashes."

```suggestion
* 포괄적으로 모든 예외를 잡는 `except:` 문은 예외를 다시 발생시키거나 프로그램 충돌을 방지하기 위한 격리 지점을 만들 때만 사용하십시오.
```
created_at: 2025-03-05T00:09:12Z
author_association: NONE
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다:
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. 즉, `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+    """
+    assert minimum >= 1024, '최소 포트 번호는 적어도 1024 이상이어야 합니다.'
+    # 아래 코드가 이전 `assert`에 의존합니다.
+    port = self._find_next_open_port(minimum)
+    assert port is not None
+    # 반환문(return statement)에 대한 타입 검사가 `assert`에 의존합니다.
+    return port
+```
+
+- 라이브러리나 패키지는 자체적인 예외를 정의할 수 있습니다. 이때 반드시 기존 예외 클래스를 상속해야 합니다. 예외 클래스의 이름은 `Error`로 끝나야 하며, `foo.FooError`처럼 불필요한 반복을 포함해서는 안 됩니다.
+
+* 포괄적으로 모든 예외를 잡는 `except:` 문이나 `Exception`, `StandardError`를 사용하지 않습니다. 다만, 다음과 같은 경우에는 예외적으로 허용됩니다.
+
+  - 예외를 다시 발생시키는 경우(re-raising the exception)
+  - 예외가 전파되지 않고 기록되거나 무시되도록 하는 격리 지점을 만드는 경우. 예를 들어, 프로그램의 특정 부분이 예외로 인해 중단되지 않도록 보호하는 용도로 사용할 수 있습니다.  
+    (예: 스레드의 최상위 블록을 감싸 충돌을 방지하는 경우)
+
+Python은 이 부분에서 매우 관대하며, `except:`문은 오타가 난 변수명, sys.exit() 호출, Ctrl+C 인터럽트, unittest 실패 등 원하지 않는 다양한 예외까지 처리할 수 있습니다.
path: google python style guide/exceptions.md
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

Consider adding a brief explanation of why Python is "관대" (lenient) in this regard. For example: "Python is lenient here, as `except:` can catch unintended exceptions like typos, `sys.exit()` calls, `Ctrl+C` interrupts, and unittest failures."

```suggestion
Python은 `except:`문이 오타, sys.exit() 호출, Ctrl+C 인터럽트, unittest 실패 등 예기치 않은 예외를 잡을 수 있기 때문에 이 부분에서 매우 관대합니다.
```
created_at: 2025-03-05T00:09:12Z
author_association: NONE
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
path: google python style guide/exceptions.md
user: login: GideokKim
body: @codingorijazz 여기 수정이 덜되어서 다시 알려드립니당
created_at: 2025-03-08T03:06:45Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
+
+예외는 특정 조건을 따라야 합니다. :
+
+- 특정 조건을 충족하는 경우 기본 예외 클래스를 사용합니다. 예를 들어, 함수 인수를 검증할 때 사전 조건이 만족되지 않는 등 프로그래밍 실수를 나타낼 경우 `ValueError`를 발생시킵니다.
+
+- `assert` 문을 조건문이나 사전 조건 검증 용도로 사용하지 않습니다. `assert`문은 애플리케이션의 핵심 로직에서 중요한 역할을 해서는 안 됩니다. 이를 판단하는 방법으로, `assert` 문을 제거해도 코드가 정상적으로 동작해야 합니다. `assert` 조건문은 [not guaranteed](https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement) 즉, 항상 실행된다는 보장이 없습니다. 다만, [pytest](https://docs.pytest.org/en/stable/) 기반 테스트에서는 `assert` 문을 사용하여 기대값을 검증하는 것이 일반적이며, 이를 사용하는 것이 권장됩니다. 예를 들어 :
+
+```python
+Yes(권장):
+  def connect_to_next_port(self, minimum: int) -> int:
+    """다음 사용 가능한 포트에 연결합니다.
+
+    매개변수(Args):
+      minimum: 1024 이상이어야 하는 포트 값.
+
+    반환값(Returns):
+      새로운 최소 포트 값.
+
+    예외(Raises):
+      ConnectionError: 사용 가능한 포트를 찾을 수 없을 경우 발생.
+    """
+    if minimum < 1024:
+      # `ValueError`를 발생시키는 경우가 문서 문자열의 "Raises:" 섹션에
+      # 명시되지 않은 이유는, API 오용에 대한 특정한 동작을
+      # 보장하는 것이 적절하지 않기 때문입니다.
+      raise ValueError(f'최소 포트 번호는 1024 이상이어야 합니다. 현재 값: {minimum}.')
+    port = self._find_next_open_port(minimum)
+    if port is None:
+      raise ConnectionError(
+          f'{minimum}번 포트 또는 그 이상에서 서비스에 연결할 수 없습니다.')
+    # `assert`의 결과에 코드가 의존하지 않습니다.
+    assert port >= minimum, (
+        f'최소 포트가 {minimum}이어야 하는데, 예상치 못한 포트 {port}가 반환되었습니다.')
+    return port
+```
+
+```python
+No(주의):
path: google python style guide/exceptions.md
user: login: GideokKim
body: @codingorijazz 여기 수정이 덜되어서 다시 알려드립니당. 그리고 commnet에 대한 resolve 처리는 comment를 시작한 사람이 하는거라 처리하고 댓글 남겨두시면 제가 확인하고 닫을게요!
created_at: 2025-03-08T03:07:34Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
path: google python style guide/exceptions.md
user: login: GideokKim
body: 모든 제목에 `#` 하나씩 더 추가해주세요!

```suggestion
## 2.4 예외
```
created_at: 2025-03-08T07:06:01Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
path: google python style guide/exceptions.md
user: login: Yoonsoyoung02
body: 다른 기여자분들의 번역과 통일성을 위해 decision은 '권장 사항' 으로 표기해주시면 감사하겠습니다 ! 

[수정]
`##` 2.4.4 결정 → `###` 2.4.4 권장 사항
created_at: 2025-03-08T08:45:40Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
+
+예외는 허용되지만, 신중하게 사용해야 합니다.
+
+## 2.4.1 정의
+
+예외는 오류나 기타 예외적인 조건을 처리하기 위해 정상적인 제어 흐름에서 벗어나는 수단입니다.
+
+## 2.4.2 장점
+
+일반적인 동작을 하는 코드의 흐름이 오류 처리 코드로 인해 복잡해지지 않습니다. 또한 특정 조건이 발생하면 여러 함수 호출 프레임을 한 번에 건너뛸 수 있도록 합니다. 예를 들어, 오류 코드를 단계별로 전달할 필요 없이, N개의 중첩된 함수 호출을 한 번에 종료할 수 있습니다.
+
+## 2.4.3 단점
+
+제어 흐름이 혼란스러워질 수 있습니다. 라이브러리 호출 시 오류 처리를 놓치기 쉽습니다.
+
+## 2.4.4 결정
path: google python style guide/exceptions.md
user: login: codingorijazz
body: 넵 감사합니다!
created_at: 2025-03-09T03:30:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+# 2.4 예외
path: google python style guide/exceptions.md
user: login: codingorijazz
body: 넵!
created_at: 2025-03-09T03:30:19Z
author_association: CONTRIBUTOR

PR comments:
user: login: GideokKim
created_at: 2025-03-04T08:41:19Z
body: @codingorijazz 마지막 3개 커밋을 revert 해주세요!

a3b401263d85960cdead1a2d6fd0b112e85e4274
f8fa8a041507c690133cafb347ad06f57ed05a5b
cd251204dbe396e4bd5ff9790b18cbe3f4647849
author_association: OWNER
user: login: GideokKim
created_at: 2025-03-05T00:08:59Z
body: /gemini review
author_association: OWNER
user: login: GideokKim
created_at: 2025-03-05T00:11:20Z
body: /gemini review
author_association: OWNER
user: login: GideokKim
created_at: 2025-03-09T05:26:47Z
body: @codingorijazz 커밋이 늘어나는게 제가 생각하는 기여 방식이랑 달라서 잠시 pending 처리하겠습니다. 오늘 밤에 다른 분이랑 원격으로 체크를 해보고 다시 말씀드릴게요.

author_association: OWNER
user: login: GideokKim
created_at: 2025-03-09T05:28:46Z
body: @Yoonsoyoung02 기여해주시는 분들 전부 현재 PR처럼 커밋이 무분별하게 늘어나는데(과거 이미 반영된게 다시 반영되듯이 커밋이 생김) 혹시 동일한 현상이 일어나시나요? 프로젝트할 때는 이렇지 않았던 것 같은데, 제가 잘못 알고 있는건가 싶어서 여쭤봅니다!
author_association: OWNER
user: login: zer0ken
created_at: 2025-03-09T10:09:36Z
body: @GideokKim 

병합 커밋 [e88d35f](https://github.com/GideokKim/google-python-style-guide-kr/pull/110/commits/e88d35fd3e7b83c6245b73bd62776764a6476170) 이전에 추가된 커밋들을 보니 병합 과정에서 `upstream/main`의 커밋이 작업 중인 브랜치에 모두 추가된 것 같습니다.

원인은 아마도 리베이스가 아닌 병합을 사용했기 때문인 것 같아요.

찾아보니 **인터랙티브 리베이스**(`git rebase -i`)라는 깃 기능이 있는데, 이걸 사용하면 특정 지점부터 N개의 커밋을 하나의 커밋으로 합칠 수 있다고 합니다.

이걸 써서 히스토리를 수정한 다음에 강제 푸시하면 비교적 빠르게 PR의 커밋 수를 줄일 수 있을 것 같습니다.

제 방법이 옳다는 확신은 없어서 조금 더 조사해봐야 할 것 같아요.
author_association: CONTRIBUTOR
user: login: GideokKim
created_at: 2025-03-09T11:46:05Z
body: @zer0ken `git rebase -i [commit hash]`로 과거 커밋들을 전부 edit, drop, squash 등 여러가지 작업이 가능해서 저도 많이 현업에서 쓰던 기능인데, 전공자 분들도 늦게 습득하시더라구요. 

많은 분들이 같은 실수를 많이 하셔서 애초에 rebase를 하라던가 `git fetch upstream`을 권장하는 것 자체가 잘못된 것 같기도 하고 기여 문서가 너무 부실해서 이걸 좀 더 자세하게 적어야 하나 싶은 생각이 드네요 ㅠㅠ
author_association: OWNER
user: login: Yoonsoyoung02
created_at: 2025-03-09T14:14:37Z
body: @GideokKim 
현령님 말씀처럼  upstream/main의 모든 변경 사항이 현재 브랜치로 들어오고 있는 것 같고, 
저 같은 경우도 여러 번 커밋을 하다보니 히스토리가 길어지는 것 같습니다.

이 부분에 대해서 조금 고민해봤을 때,
현재 기여자분들이 한 번씩은 모두 pr을 경험해보셨고 초반이라 CONTRIBUTING.md 파일을 많이 참고하실테니, `rebase`로 수정하되 history 수정이나 충돌 발생 시 해결 가이드를 드리면 어떨까 하는 생각이 듭니다.
만약 충돌 등의 문제가 발생한다고 했을 때 해결할 수 있는 비교적 여유로운 시점이 4월 전이라 지금이 적합하다는 생각도 드네요!!

_(비전공자인 저의 입장에서도 깃헙이 쉽지는 않지만 이를 경험하기 위해 프로젝트에 참여했고, 그런 부분에 있어서 지금과 같이 권장해주시는 것들을 따라가는 게 흥미롭습니다!! 🔥)_
author_association: COLLABORATOR