例外処理について、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: 例外をキャッチする
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: 終了
例外処理の除外: エラーハンドリングをしない
意図的に例外処理を行わずにエラーをそのまま発生させるケースがあるみたい。
例外処理を消して実行してみた。
def method_without_exception_handling
puts 'メソッド3: 開始'
# ゼロ除算エラーを引き起こす
result = 10 / 0
puts 'メソッド3: 終了'
end
# 処理を開始する
method_without_exception_handling
メソッド1: 開始
メソッド2: 開始
メソッド3: 開始
divided by 0 (ZeroDivisionError)
まとめ
実際にコードを書いて実行することで、例外処理の処理される流れを理解できました!