【Python】例外処理

例外処理は、プログラムの実行中に発生する可能性のあるエラーを処理するための重要な機能です。
# Python の例外処理の基本的な構造
```python
try:
    # エラーが発生する可能性のあるコード
except:
    # エラーが発生した場合の処理
else:
    # エラーが発生しなかった場合の処理
finally:
    # エラーの有無に関わらず必ず実行される処理
```
## 基本的な例外処理
```python
try:
    number = int(input("数字を入力してください: "))
    result = 10 / number
    print(f"10 / {number} = {result}")
except ValueError:
    print("数字以外が入力されました。")
except ZeroDivisionError:
    print("0で割ることはできません。")
```
ユーザーからの入力を数値に変換し、10をその数で割り当てます。2つの可能性のあるエラーが発生しています。
- ValueError: 数字以外で注文した場合
- ZeroDivisionError: 0個購入しました
## elseとfinallyの使用
```python
try:
    file = open("example.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("ファイルが見つかりません。")
else:
    print("ファイルの読み込みに成功しました。")
finally:
    file.close()
    print("ファイルを閉じました。")
```
- tryブロック: ファイルを開いて読み込みます
- except: 問題が発生した場合は、エラーが発生します
- else:エラーが発生して発生しました
- finally:エラーの有無に関わらず、必ずファイルを閉じます
## 独自の例外の作成と使用
```python
class NegativeNumberError(Exception):
    pass

def calculate_square_root(number):
    if number < 0:
        raise NegativeNumberError("負の数の平方根は計算できません。")
    return number ** 0.5

try:
    result = calculate_square_root(-4)
    print(f"平方根: {result}")
except NegativeNumberError as e:
    print(f"エラー: {e}")
```
- 独自の例外NegativeNumberErrorを定義しています
- calculate_square_rootで、負の数にこの例外が発生しています
- try-exceptブロックでこの例外を捕捉し、適切なメッセージを表示しています

これらの例を通じて、Python の例外処理の基本的な使い方が理解できたかと思います。例外処理を制御することで、プログラムの安定性と可読性を決定します。
# exceptについて
exceptは、Python の例外処理において、発生したエラーを捕捉処理するために使用されます。以下に、exceptの様々な使用方法と特徴を示します。
## 基本的な使用方法
```python
try:
    # エラーが発生する可能性のあるコード
except ExceptionType:
    # 特定の種類のエラーが発生した場合の処理
```
## 複数の例外の処理
複数の異なる種類の例外を個別に処理することができます。
```python
try:
    number = int(input("数字を入力してください: "))
    result = 10 / number
    print(result)
except ValueError:
    print("数字以外が入力されました。")
except ZeroDivisionError:
    print("0で割ることはできません。")
```
## 複数の例外をまとめて処理
複数の例外をまとめて処理したい場合は、タプルを使用してまとめることができます。
```python
try:
    # コード
except (ValueError, ZeroDivisionError):
    print("数値エラーが発生しました。")
```
## エラーメッセージ
エラーの取得が可能です。
```python
try:
    # コード
except Exception as e:
    print(f"エラーが発生しました: {e}")
```
## 全ての例外を catch
特定の例外ではなく、全ての例外を catch すること。これは一般的に推奨されます。
```python
try:
    # コード
except:
    print("何らかのエラーが発生しました。")
```
## else と finally との組み合わせ
exceptはelseとfinallyを必要とします。
```python
try:
    # コード
except Exception as e:
    print(f"エラーが発生しました: {e}")
else:
    print("エラーは発生しませんでした。")
finally:
    print("この処理は常に実行されます。")
```
## 例外の再発生
捕捉した例外を次に示し、再び発生します。
```python
try:
    # コード
except Exception as e:
    print(f"エラーが発生しました: {e}")
    raise  # 捕捉した例外を再発生させる
```
## カスタム例外の使用
自作の例外クラスを定義し、それをでexcept捕捉することができます。
```python
class MyCustomError(Exception):
    pass

try:
    raise MyCustomError("これは自作の例外です。")
except MyCustomError as e:
    print(f"カスタムエラーが発生しました: {e}")
```
これらの様々なexcept方法を理解し、適切に使用することで、より堅牢なエラー処理を実現できます。エラーの種類に応じて適切な処理を行うことで、プログラムの信頼性と使いやすさを決定します。
# 主なエラーについて
Python には多くの組み込み例外があります。ValueError と ZeroDivisionError以外で頻繁に使用される重要な例外の一部を紹介します。
## TypeError
型が異常な操作や関数呼び出しを行った場合に使用します。
```python
try:
    result = "42" + 42
except TypeError as e:
    print(f"型エラー: {e}")
```
## IndexError
リストやタプルなどのシーケンスで、存在しないインデックスにアクセスしようとする際に使用します。
```python
try:
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError as e:
    print(f"インデックスエラー: {e}")
```
## KeyError
存在しないキーでアクセスしようとしています。
```python
try:
    my_dict = {"a": 1, "b": 2}
    print(my_dict["c"])
except KeyError as e:
    print(f"キーエラー: {e}")
```
## FileNotFoundError
ファイルを開いたままでは存在しません。
```python
try:
    with open("non_existent_file.txt", "r") as file:
        content = file.read()
except FileNotFoundError as e:
    print(f"ファイルが見つかりません: {e}")
```
## AttributeError
オブジェクトが持っていない属性やメソッドにアクセスしようとしていますが利用できません。
```python
try:
    number = 42
    number.append(10)  # intオブジェクトにはappendメソッドがない
except AttributeError as e:
    print(f"属性エラー: {e}")
```
## ImportError
モジュールのインポートに失敗した場合に使用します。
```python
try:
    import non_existent_module
except ImportError as e:
    print(f"インポートエラー: {e}")
```
## NameError
定義されていない変数を使用するつもりはありません。
```python
try:
    print(undefined_variable)
except NameError as e:
    print(f"名前エラー: {e}")
```
## RuntimeError
プログラムの実行中に発生する一般的なエラーです。他の例外カテゴリに当てはまらない場合があります。
```python
try:
    raise RuntimeError("何か予期せぬことが起こりました")
except RuntimeError as e:
    print(f"ランタイムエラー: {e}")
```
## OverflowError
数値演算の結果が大きくて表現ができなくなります。
```python
import sys
try:
    result = sys.maxsize + 1
except OverflowError as e:
    print(f"オーバーフローエラー: {e}")
```
これらの例外は、Python プログラミングで頻繁に遭遇する可能性のあるものです。適切な例外処理により、予期せぬエラーに対して適切に対応し、プログラムの安定性を向上させることができます。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)