【Ruby入門】エラーと例外処理
  • facebookページ
  • twitterページ
  • 2017.12.19

    【Ruby入門】エラーと例外処理

    プログラムは、1行づつ処理されていきます。

    その中で、ありえない結果が出たとき、どうすればよいでしょうか?

    例えばゼロで割り算したり、ネットワーク上のトラブルでデータベースに接続できなかったり、ユーザーが仕様上ありえない入力をしたり・・・

    都度プログラマーが対応できれば良いのですが、それも不可能です。

    エラーが発生したとき、どのように振る舞うかを決めるのが例外処理です。

    他の言語では、try catch構文と呼ばれることが多いです。

    本記事では、エラーと例外処理について解説します。

    例外処理とは何か

    もう少し例外処理について、詳細に見ていきましょう。

    まずは原因からです。

    システム上のエラーは、次のようなものがあります。

    • ゼロで割り算した
    • ネットワーク上のトラブルで接続不可
    • 想定している場所にファイルがない
    • プログラム上のミス

    ユーザー起因のエラーは、次のようなものがあります。

    • 仕様上ありえない値を入力した
    • 想定外のキー操作をした
    • 型のちがう値を入力した(数値の欄に文字、など)

    これらがおおまかな原因です。

    プログラマーや設計者は、上記のケースを想定してプログラムはどう振る舞うべきかを考えなくてはなりません。

    画面上に「divided by 0 (ZeroDivisionError)」などといったユーザーがどう対処してよいか分からない表示をさせてはいけません。

    (Webシステム開発では何らかのフレームワークを使うことが多いです。フレームワーク上にはたいてい入力値チェックがあらかじめ準備されています。それをバリデーションといいます)

    例外処理をソースコードで

    プログラムの実行中に何らかのエラーが発生すると、プログラムは例外処理を探します。それがあれば実行します。

    ソースコードで見ていきましょう。

    エラーの発生が予想される箇所で、何らかのエラーが発生したとします。すると例外処理が実行されます。

    また、エラーの詳細を得る仕組みも用意されています。エラーが発生すると自動的に例外オブジェクトが生成されます。

    これを使って、まずは日本語でやさしくエラー表示するまで頑張りましょう。

    例外処理を実装する

    単純にゼロで割り算した場合どうなるか、試してみましょう。

    これだけです。

    実行してみるとこんなエラーが返ります。

    これをやさしく「入力値に問題があります(ゼロで除算)」と表示させましょう。

    [実行結果]

    雰囲気はお分かりいただけたでしょうか?

    エラー補足後、どうしたいか

    上記はまだ簡単な例で、単にエラーが発生しても普通に終わるだけです。

    それだけではありません。

    エラーの原因を解消する

    ファイル操作においてディレクトリがない、よって読み書きができないという例です。

    こういう場合は単に「欲しい場所にディレクトリを作る」という対応が考えられます。

    その他、プログラム上で何とかなる理由ならいっそ「何とかするプログラム」をrescueに書いてしまえばよいのです。

    無視して続行

    ユーザーが任意入力欄に何も入力しなかった、などです。

    ユーザー側からすれば何も入力することがない、しかしシステム上どうしても何かの値が必要という場合です。

    つまりnilで処理するとエラーになるので、長さゼロの文字列(一般的に空文字と呼ばれる)に置き換えて後続処理を実行するという例です。

    ユーザーからすれば何もなかったかのように終了します。

    強制的に終了させる

    ユーザーがありえない値を入力したので、エラーを表示してそこで終了させるといった例です。

    ありえないまま後続処理して、ありえない値がDBに入って問題が発生するのは防げます。

    より複雑な例外処理例:ファイルへの書き込み

    もう少し複雑な例外処理として、ファイル操作を例にあげます。

    • ファイルのオープン
    • ファイルへ何か書き込む
    • ファイルのクローズで終了

    ここで、ファイルのオープンは確実だが、書き込んだときに何かのエラーが発生したと想定します。

    対処するパターンごとに解説していきます。

    必ず実行させたいものがある ensure

    エラーの発生にかかわらず、必ず実行させたい処理がある場合はensureを使います。

    先の例でいうと、ファイルのクローズです。

    書き込みに成功しようが失敗しようが、必ず閉じなければいけません。

    ということは、ensureでクローズする処理を書けばよいのです。

    (「【Ruby入門】入力と出力」にて解説したとおり、本来ならファイル操作はブロックで行います。ブロックで行えばオープンとクローズを意識する必要はありません。)

    超強引に例外処理を試したい場合は、以下のようにします。

    [実行結果]

    無理やり発生させたエラーですが、エラーの発生とensureを通過したことを確認できました。

    再度処理する retry

    retryを使い、成功するまで再実行することができます。

    ファイルの書き込みが成功するまで続けます。

    処理例外を指定する

    ある程度エラーが限定されて、そのエラーごとに対処を振り分けたいときがあります。

    実装は省略しますが、これで例外処理の振り分けが可能です。

    まとめ

    本記事では、エラーと例外処理について解説しました。

    プログラムが複雑になればなるほど、例外処理の重要度が高まります。

    本記事を読んで、実際に試してエラーと例外処理の理解を深めてくださいね!


    他のRuby入門記事はこちら

    【Ruby入門】Rubyとは何か?学習方法や将来性まで考えました!

    【Ruby入門】Ruby on Railsをやってみよう!

    【Ruby入門】環境構築(Mac/Win)

    【Ruby入門】nokogiriでスクレイピング

    【Ruby入門】データベース

    【Ruby入門】gemとライブラリ

    【Ruby入門】エラーと例外処理

    【Ruby入門】モジュール(module)とMix-in

    【Ruby入門】Procクラスとラムダ(lambda)

    【Ruby入門】ブロック

    【Ruby入門】メソッド

    【Ruby入門】クラスをコーディング(2) オブジェクト指向

    【Ruby入門】クラスをコーディング(1) classを作る

    【Ruby入門】クラスの継承、オーバーライド

    【Ruby入門】クラスとオブジェクト

    【Ruby入門】ディレクトリ(フォルダ)の作成、削除

    【Ruby入門】ファイルの移動、コピー、削除

    【Ruby入門】入力と出力

    【Ruby入門】Rubyの正規表現

    【Ruby入門】正規表現で置換する

    【Ruby入門】正規表現とは何か?

    【Ruby入門】文字列の結合などの操作

    【Ruby入門】CSVの基本と操作

    【Ruby入門】JSONの基本と操作

    【Ruby入門】乱数(Random)などの数値計算用クラスや端数処理

    【Ruby入門】日付の基本と操作(Time, Date)

    【Ruby入門】数値の数え上げ「upto」と四捨五入

    【Ruby入門】文字列の標準ライブラリnkfとヒアドキュメント

    【Ruby入門】数値の基本とメソッド (timesメソッド他)

    【Ruby入門】ハッシュ(hash)をeachで取り出す!その他ハッシュの応用に

    【Ruby入門】ハッシュ(hash)とシンボルの基本

    【Ruby入門】文字列の基本と表示メソッド

    【Ruby入門】Rubyの繰り返しを極める!様々な繰り返しのバリエーション

    【Ruby入門】最初はこれだけ!まずは手を動かしたい人のRuby入門

    【Ruby入門】ifとelseについて

    【Ruby入門】配列と操作(基本編)

    【Ruby入門】eachメソッドの使い方と応用例


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE