Pythonの例外回避。

# はじめに
Pythonで、該当のファイルがない、該当の値がないことによって例外が発生するとスクリプトが中断される。例外で中断することなく継続処理することのできるtry-exceptが便利なのでまとめる。

# 目次
+ [try-except](#try-except)
+ [try-exceptを使ってファイルの新規作成](#try-exceptを使ってファイルの新規作成)
+ [Exceptionで例外の内容確認](#exceptionで例外の内容確認)
+ [BaseExceptionですべての例外を取得する](#baseexceptionですべての例外を取得する)
+ [例外一覧](#例外一覧)

## try-except
例えばこのスクリプトを実行すると例外が発生し、処理が中断される。
```python
dic={'key1':'val1','key2':'val2','key3':'val3'}
print(dic['key5'])
print('処理完了')

# ----------------------------------------------
# print(dic['key5'])
# KeyError: 'key5'
```

下記のように、try-exceptを使い、exceptに例外処理を記述すると、例外が処理されてスクリプトは継続できる。
```python
dic={'key1':'val1','key2':'val2','key3':'val3'}

try:
	print(dic['key5'])
except:
	print('該当するkeyはありません。')
print('処理完了')

# -------------------------------------------------------------------
# 該当するkeyはありません。
# 処理完了
```
[戻る](#目次)

## try-exceptを使ってファイルの新規作成
追記を想定しているExcelファイルで、ファイルが存在しなければ新規作成する場合の例。

```python
import openpyxl as px

# ファイルが存在しなければ例外処理で新規作成
try:
	wb = px.load_workbook('test.xlsx')
except:
	print('ファイルがないので新規作成します。')
	wb = px.Workbook()

#-------------------
# ここにExcelの処理を記述
#-------------------

#Save
wb.save('test.xlsx')
```
[戻る](#目次)

## Exceptionで例外の内容確認
exceptした時のエラーの内容を確認する場合は、基底クラス```Exception```を使う。

```python
try:
	print(dic['key5'])
except Exception as e:
	print(f'{e=}')
	print('該当するkeyはありません。')
print('処理完了')

# -------------------------------------------------------------------
# e=KeyError('key5')
# 該当するkeyはありません。
# 処理完了
```
```python
import openpyxl as px

## ファイルが存在しなければ例外処理で新規作成
try:
	wb = px.load_workbook('test.xlsx')
except Exception as e:
	print(f'{e=}')
	print('ファイルがないので新規作成します。')
	wb = px.Workbook()

#-------------------
# ここにExcelの処理を記述
#-------------------

#Save
wb.save('test.xlsx')

# -------------------------------------------------------------------
# e=FileNotFoundError(2, 'No such file or directory')
# ファイルがないので新規作成します。
```
[戻る](#目次)

## BaseExceptionですべての例外を取得する
```KeyboardInterrupt```含めすべての例外を取得することができる。

```python
try:
	input('CTRL+Cで終了してください。')
except Exception as e:
	print(f'{e=}')
print('到達しない')

# -------------------------------------------------------------------
# Traceback (most recent call last):
# ...
# input('CTRL+Cで終了してください。')
# KeyboardInterrupt
# ^C
```
```python
try:
	input('CTRL+Cで終了してください。')
except BaseException as e:
	print(f'{e=}')
print('到達する')

# -------------------------------------------------------------------
# CTRL+Cで終了してください。e=KeyboardInterrupt()
# 到達する
```
[戻る](#目次)

## 例外一覧
参考

https://docs.python.org/ja/3/library/exceptions.html#Exception

```
BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── ImportError
      │    └── ModuleNotFoundError
      ├── LookupError
      │    ├── IndexError
      │    └── KeyError
      ├── MemoryError
      ├── NameError
      │    └── UnboundLocalError
      ├── OSError
      │    ├── BlockingIOError
      │    ├── ChildProcessError
      │    ├── ConnectionError
      │    │    ├── BrokenPipeError
      │    │    ├── ConnectionAbortedError
      │    │    ├── ConnectionRefusedError
      │    │    └── ConnectionResetError
      │    ├── FileExistsError
      │    ├── FileNotFoundError
      │    ├── InterruptedError
      │    ├── IsADirectoryError
      │    ├── NotADirectoryError
      │    ├── PermissionError
      │    ├── ProcessLookupError
      │    └── TimeoutError
      ├── ReferenceError
      ├── RuntimeError
      │    ├── NotImplementedError
      │    └── RecursionError
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning
```
[戻る](#目次)