Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyで「Begin」および「Rescue」キーワードを使用する方法

Rubyでよくある問題は、エラーメッセージが表示されることです。これは、技術用語では「例外」と呼ばれます。

これらの例外は予想される可能性があります 、時々利用できるが他の人にはないファイル、またはいくつかの制限のために一時的にしか利用できないAPIのように、または予期しない

今日は、予想されるエラーの管理方法を学びます。

どのように?

さて、Rubyの「begin」と「rescue」を紹介します。これは、エラー状態の処理に使用される2つの重要なキーワードです。

どのように機能しますか?

まず、何かを理解する必要があります。

Rubyプログラムは、実行中に複数のポイントでエラーを引き起こす可能性があります。

例にはが含まれます :

  • 存在しないファイルを読み込もうとしています。
  • 数値をゼロで割る。
  • 使用しているウェブサーバーに古いSSL証明書があります。

エラーが発生した場合…Rubyはすぐにはクラッシュしません!

エラーから回復するチャンスが得られます 。これを「例外処理」と呼びます。

Rubyには、コードにエラー回復を実装するためのいくつかのキーワードがあります。これらのキーワードはbeginレスキュー

それらの使い方を見つけましょう!

Ruby例外を処理する方法

これらの例外をどのように処理しますか?

例外を発生させるコードは、 beginでラップできます。 /レスキュー ブロック。

仕組みは次のとおりです…

最初のセクション( begin )、実行しようとしているコードがあり、例外が発生する可能性があります。

begin
  IO.sysopen('/dev/null')
rescue
  # ...
end

ここでは、 sysopenでファイルを開こうとしています。 。ファイルを開くことができない場合は、例外が発生します。

これは、 rescueを使用するのに最適な時期です キーワード!

このキーワードを使用すると、例外が発生したときに何をしたいかを言うことができます。したがって、障害モードはあなたの管理下にあります。

begin
  IO.sysopen('/dev/null')
rescue
  puts "Can't open IO device."
end

このエラーをログに記録し、何らかのデフォルト値を提供する必要があります。

しないでください。無視。エラー。

複数の例外の救済

あなたはそのrescueを知る必要があります オプションの引数を取ります。

この議論は何ですか?

この引数は例外クラスです 救出したいもの。

実行しているコードによって異なります。

IOの場合 :

  • これはErrno::ENOENTの可能性があります 不足しているファイルの場合
  • またはErrno::EACCES 権限エラーの場合

最良の部分は?

同じbegin/rescueブロックで複数の例外を処理できます。

このように

begin
  IO.sysopen('/dev/null')
rescue Errno::ENOENT
  puts "File not found."
rescue Errno::EACCES
  puts "Insufficient permissions, not allowed to open file."
end

複数の例外に対して同じアクションを発生させたい場合…

これを行うことができます

begin
  IO.sysopen('/dev/null')
rescue Errno::ENOENT, Errno::EACCES
  puts "There was an error opening the file."
end

学び続けましょう!

ブロックとメソッド内の例外をレスキューする方法

必ずしもbeginを使用する必要はありません キーワード。

省略できる場合があります。

どこ?

メソッドとブロックの内部。

def get_null_device
  IO.sysopen('/dev/null')
rescue Errno::ENOENT
  puts "Can't open IO device."
end

メソッド定義自体がbeginの作業を行います 、省略できます。

ブロックを使用してこれを行うこともできます。

["a.txt", "b.txt", "c.txt"].map do |f|
  IO.sysopen(f)
rescue Errno::ENOENT
  puts "Can't open IO device: #{f}."
end

ここで、 rescueを使用するもう1つの方法があります beginのないキーワード 。

それがどのように機能するか見てみましょう。

インラインレスキューを理解する&なぜそれが危険なのか

rescueを使用できます インライン。

いくつかのまれなシナリオでは、この形式の例外処理が役立つ場合があります。

ここに例があります

["a.txt", "b.txt", "c.txt"].select { |f| File.open(f) rescue nil }.map(&:size)

これにより、存在するファイルのみを開き、存在しないファイルを無視することができます。

その結果、既存のファイルのサイズを取得できます。

例外は発生しません。

なぜこれを行うのですか?

そうですね、コードをすべて1行にまとめることができます。

以上です。

この形式のrescueを使用すると、「隠れた危険」が発生します StandardErrorから派生するすべての例外を取得しているためです 。

ほとんどの例外です。

なぜそれが良くないのですか?

幅広い選択肢ではなく、特定の例外のみを処理するのが最善だからです。

これにより、エラーを自分から隠すことを回避できます!

隠れたエラーは、あらゆる種類の奇妙な動作やデバッグが困難な問題につながる可能性があります。

概要

Rubyのエラー、基本的な例外処理、 rescueについて学習しました。 /開始 キーワード。

役に立ったと思ったら、この記事を共有してください🙂

読んでくれてありがとう!


  1. Ruby Mapメソッドの使用方法(例付き)

    Mapは、配列、ハッシュ、範囲で使用できるRubyメソッドです。 マップの主な用途は、データを変換することです。 例 : 文字列の配列が与えられた場合、すべての文字列に目を通し、すべての文字を大文字にすることができます。 または、Userのリストがある場合 オブジェクト… 変換できます 対応するメールアドレス、電話番号、またはその他の属性のリストにそれらを追加します Userで定義 クラス。 これを行う方法を正確に見てみましょう! ルビーマップ構文 マップの構文は次のようになります: array = [a, b, c] array.map { |string| string.

  2. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた