例外処理について調べてみた！

例外処理について、ChatGPTと一緒に勉強してみました！

## ChatGPT
例外処理は、プログラムが実行中に予期せぬ状況が発生した際に、それに対処するための仕組みです。これはプログラムの正常な流れを中断し、エラーや異常状態に対する適切な対応を可能にします。

# 例外処理の基本: プログラムの異常状態への対応方法 🚀

プログラムを書く際には、エラーや異常な状態が発生することがあります。そんなときに役立つのが「例外処理」です。

## 1. 例外処理って何？

例外処理は、プログラムが実行中にエラーや異常な状態が発生した際に、それに適切に対応する仕組みです。
例外処理を使用することで、プログラムが終了せずにエラーをハンドリングすることが可能になります。

## 2. 例外ってどんなもの？

プログラムでの例外は、エラーや異常な状態を表す。
例外を投げることで、プログラムがその状況にどう対処するかを示すことができる。
Rubyでは raise を使って例外を投げることができる。そして、rescue ブロックを使ってその例外をキャッチし、適切な処理を行っていく。

## 3. 例外処理の基本構文

Rubyでは `begin`, `rescue`, `end` を使って例外処理を行う。
例外が発生する可能性があるコードを `begin` から `end` までで囲み、例外をキャッチして適切な処理を行っていく。

## 4. Rubyにおける例外の種類

例外クラスとそれぞれの役割について調べてみた！

### 4.1. StandardError

#### ChatGPT
>Rubyのプログラムでよく起こるさまざまなエラーの「親クラス」みたいなものです。親クラスとは、同じ種類のものをまとめて管理する大元のようなものです。
例えば、学校のクラスがあって、それぞれのクラスには色んな生徒がいますよね。この時、学校全体のクラスを「親クラス」と考えると分かりやすいです。同じように、「StandardError」はたくさんのエラーの親クラスです。
具体的に言うと、プログラムを実行している途中で起こる「一般的なエラー」が、このStandardErrorのもとで管理されています。例えば、計算中に数学的な問題が起きたり、変なデータを扱おうとしたりすると、これに該当します。
これがあるおかげで、プログラムが壊れたときに、どんなエラーが起きたのかを知りやすくなります。そして、そのエラーに合わせて対処することができるんです。
簡単に言うと、「StandardError」はプログラムが驚いたり、戸惑ったりするときの、エラーの基本的なまとめ役なんです！

### 4.2. RuntimeError

#### ChatGPT
>StandardErrorは、プログラムが実行されている最中に起こる問題やエラーの「おおもと」みたいなものです。もしプログラムが予期しない挙動を示したり、うまく動かなかったりすると、このクラスに関連するエラーが起こる可能性があります。
たとえば、プログラムで配列の特定の位置にアクセスしようとしたときに、その位置が存在しない場合や、変数がちゃんと定義されていない場合、このエラーが発生することがあります。
簡単に言うと、「StandardError」はプログラムが驚いたり、困ったりするときの、エラーの基本的な管理者みたいなものです。

### 4.3. ArgumentError

#### ChatGPT
>**ArgumentError（引数エラー）**は、プログラムがメソッド（関数）を呼び出す際、そのメソッドが求める「情報」を正しく提供していない場合に起きるトラブルです。
イメージすると、プログラムが「お願い事」をするときに、必要な情報がちゃんと伝えられないと怒られる感じです。たとえば、「あの本のページ数を教えて」と言われたときに、「どの本？」と指定されなかったら、「どの本のページ数？」と怒られるのと似ています。

### 4.4. NameError

#### ChatGPT
>**NameError（名前エラー）**は、プログラムが「あれ？その名前のもの、知らないよ」と言っているエラーです。
イメージすると、プログラムが「友達の名前を呼んで！」と言われても、その友達がいない場合、プログラムは「その友達、知らないなぁ」と言ってしまいます。

### 4.5. ZeroDivisionError
#### ChatGPT
>**ZeroDivisionError（ゼロ除算エラー）**は、数学でいうところの「ゼロで割る」ことをプログラムでしようとしたときに出るエラーです。プログラムはゼロを割ることができないので、「ゼロで割ろうとしていますよ！」と注意されるイメージです。

### 4.6. NoMethodError
#### ChatGPT
>**NoMethodError（メソッド未定義エラー）**は、ある「道具（メソッド）」が見つからないときに出るエラーです。例えば、スプーンでご飯を食べようとしたら、スプーンが見当たらないときに「スプーンがありませんよ！」と怒られる感じです。

### 4.7. TypeError
#### ChatGPT
>**TypeError（型エラー）**は、プログラムが「これって何の道具？」と混乱するときに出るエラーです。たとえば、釘をハンマーで打とうとしたら、釘を打つ道具が違うので「これは違うよ！」と指摘される感じです。

### 4.8. FileNotFoundError
#### ChatGPT
>**FileNotFoundError（ファイル未発見エラー）**は、プログラムが「そのファイル、見当たらないよ！」と怒るエラーです。例えば、指定した場所に本がなかったら「その本、見当たらないんだけど」と言われる感じです。



## 5. 実際の例
実際にコードを書いて、例外処理の流れを追ってみた。

# メソッド1: 例外をキャッチする
```Ruby
def method_with_exception_handling
  puts 'メソッド1: 開始'
  
  begin
    # メソッド2を呼び出す
    method2
  rescue => e
    puts '例外が発生しました'
  end
  
  puts 'メソッド1: 終了'
end

# メソッド2: ゼロ除算エラーを引き起こす
def method2
  puts 'メソッド2: 開始'
  
  # ゼロ除算エラーを引き起こす
  result = 10 / 0
  
  puts 'メソッド2: 終了'
end

# 処理を開始する
method_with_exception_handling
メソッド1: 開始
メソッド2: 開始
メソッド3: 開始
例外が発生しました
メソッド1: 終了
```


# 例外処理の除外: エラーハンドリングをしない

意図的に例外処理を行わずにエラーをそのまま発生させるケースがあるみたい。
例外処理を消して実行してみた。

```ruby
def method_without_exception_handling
  puts 'メソッド3: 開始'
  
  # ゼロ除算エラーを引き起こす
  result = 10 / 0
  
  puts 'メソッド3: 終了'
end

# 処理を開始する
method_without_exception_handling
メソッド1: 開始
メソッド2: 開始
メソッド3: 開始
divided by 0 (ZeroDivisionError)
```

# まとめ
実際にコードを書いて実行することで、例外処理の処理される流れを理解できました！