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

Rubysの奇妙なErrno例外を理解する

Rubyの例外階層を見たことがあれば、何か奇妙なことに気づいたかもしれません。 RuntimeErrorやNoMethodErrorなどの通常の例外すべてに加えて、Errno::*への奇妙な参照があります。 。

Exception
  StandardError
    ...
    SystemCallError
      Errno::*
    ...

ディスクがいっぱいになったときにディスクに書き込むことができなかった場合、または障害のあるネットワークを介してAPI呼び出しを行おうとしたことがある場合は、このタイプのエラーが実際に発生しているのを目にしたことがあるでしょう。存在しないファイルを開こうとすると、今すぐトリガーできます。

irb> File.open("badfilename.txt")
Errno::ENOENT: No such file or directory @ rb_sysopen - badfilename.txt
    from (irb):9:in `initialize'
    from (irb):9:in `open'
    from (irb):9
    from /Users/snhorne/.rbenv/versions/2.1.0/bin/irb:11:in `<main>'

しかし、Erronoの例外は正確には何ですか?そして、なぜ彼らは他の種類の例外に感謝して異なって扱われるのですか?

RubyをOSに適応させる

Errnoの例外は、本質的にはアダプターです。オペレーティングシステムのエラーをRubyの例外システムに接続します。オペレーティングシステムはRubyとは異なる方法でエラーを処理するため、持っている ある種のアダプターを持っていること。

ルビーでは、エラーは例外として報告される傾向があります。ただし、オペレーティングシステムのエラーは通常、単なる整数です。したがって、rubyは、考えられるOSエラーごとに1つの例外クラスを定義します。次に、これらすべての例外をモジュールに貼り付けます。 エルノと呼ばれる。

IRBを使用して、このモジュールのすべての例外を確認できます。そして、男の子、たくさんありますか!

irb> Errno.constants
=> [:NOERROR, :EPERM, :ENOENT, :ESRCH, :EINTR, :EIO, :ENXIO, :E2BIG, :ENOEXEC, :EBADF, :ECHILD, :EAGAIN, :ENOMEM, :EACCES, :EFAULT, :ENOTBLK, :EBUSY, :EEXIST, :EXDEV, :ENODEV, :ENOTDIR, :EISDIR, :EINVAL, :ENFILE, :EMFILE, :ENOTTY, :ETXTBSY, :EFBIG, :ENOSPC, :ESPIPE, :EROFS, :EMLINK, :EPIPE, :EDOM, :ERANGE, :EDEADLK, :ENAMETOOLONG, :ENOLCK, :ENOSYS, :ENOTEMPTY, :ELOOP, :EWOULDBLOCK, :ENOMSG, :EIDRM, :ECHRNG, :EL2NSYNC, :EL3HLT, :EL3RST, :ELNRNG, :EUNATCH, :ENOCSI, :EL2HLT, :EBADE, :EBADR, :EXFULL, :ENOANO, :EBADRQC, :EBADSLT, :EDEADLOCK, :EBFONT, :ENOSTR, :ENODATA, :ETIME, :ENOSR, :ENONET, :ENOPKG, :EREMOTE, :ENOLINK, :EADV, :ESRMNT, :ECOMM, :EPROTO, :EMULTIHOP, :EDOTDOT, :EBADMSG, :EOVERFLOW, :ENOTUNIQ, :EBADFD, :EREMCHG, :ELIBACC, :ELIBBAD, :ELIBSCN, :ELIBMAX, :ELIBEXEC, :EILSEQ, :ERESTART, :ESTRPIPE, :EUSERS, :ENOTSOCK, :EDESTADDRREQ, :EMSGSIZE, :EPROTOTYPE, :ENOPROTOOPT, :EPROTONOSUPPORT, :ESOCKTNOSUPPORT, :EOPNOTSUPP, :EPFNOSUPPORT, :EAFNOSUPPORT, :EADDRINUSE, :EADDRNOTAVAIL, :ENETDOWN, :ENETUNREACH, :ENETRESET, :ECONNABORTED, :ECONNRESET, :ENOBUFS, :EISCONN, :ENOTCONN, :ESHUTDOWN, :ETOOMANYREFS, :ETIMEDOUT, :ECONNREFUSED, :EHOSTDOWN, :EHOSTUNREACH, :EALREADY, :EINPROGRESS, :ESTALE, :EUCLEAN, :ENOTNAM, :ENAVAIL, :EISNAM, :EREMOTEIO, :EDQUOT, :ECANCELED, :EKEYEXPIRED, :EKEYREJECTED, :EKEYREVOKED, :EMEDIUMTYPE, :ENOKEY, :ENOMEDIUM, :ENOTRECOVERABLE, :EOWNERDEAD, :ERFKILL, :EAUTH, :EBADRPC, :EDOOFUS, :EFTYPE, :ENEEDAUTH, :ENOATTR, :ENOTSUP, :EPROCLIM, :EPROCUNAVAIL, :EPROGMISMATCH, :EPROGUNAVAIL, :ERPCMISMATCH, :EIPSEC]

しかし、なぜ彼らはそれほど不可解な名前が付けられているのですか?つまり、ENOINTが「ファイルが見つかりません」という意味であるとどのように推測するのでしょうか。

...実際には非常に簡単な答えがあります。

libcから卸売りをコピー

Errnoモジュールを最初に作成した人は誰でも、エラー名をlibcから直接コピーしただけです。したがって、CでのENOINTは、OSがファイルを見つけられなかったときに返す整数エラーコードを含むマクロの名前です。

したがって、これらのそれぞれが実際に何をするのかを知るための秘訣は、C標準ライブラリのドキュメントを調べることです。あなたはここでそれらの大きなリストを見つけることができます。以下に、より関連性の高いものをいくつか抜粋しました。

EPERM 操作は許可されていません。許可がない限り、ファイルにアクセスすることはできません。
ENOENT ファイルまたはディレクトリが見つかりません。
EIO 入出力エラー;通常、物理的な読み取りまたは書き込みエラーに使用されます。
EBADF 不正なファイル記述子。たとえば、読み取り専用に開いたファイルに書き込もうとすると、このエラーが発生します。
ECHILD 子プロセスを操作しようとしましたが、子プロセスがありません。
ENOMEM RAMが不足しているため、これ以上仮想メモリを割り当てることができません。
EACCES 許可が拒否されました。ファイルのアクセス許可は、試行された操作を許可しません。
ENOTBLK 通常のファイルをHDDなどのデバイスとしてマウントしようとしました。
EBUSY リソースビジー;共有できないシステムリソースはすでに使用されています。たとえば、現在マウントされているファイルシステムのルートであるファイルを削除しようとすると、このエラーが発生します。
EEXIST ファイルが存在します。既存のファイルは、新しいファイルを指定することだけが意味を持つコンテキストで指定されました。
ENOTDIR ディレクトリが必要なときに、ディレクトリではないファイルが指定されました。
EISDIR ファイルはディレクトリです。書き込み用にディレクトリを開いたり、ディレクトリへのハードリンクを作成または削除したりすることはできません。
EINVAL 引数が無効です。これは、ライブラリ関数に間違った引数を渡すことに関するさまざまな種類の問題を示すために使用されます。
EMFILE 現在のプロセスで開いているファイルが多すぎて、これ以上開くことができません。重複する記述子は、この制限にカウントされます。
EFBIG ファイルが大きすぎます。ファイルのサイズは、システムで許可されているサイズよりも大きくなります。
ENOSPC デバイスにスペースが残っていません。ディスクがいっぱいであるため、ファイルへの書き込み操作が失敗しました。
ESPIPE 無効なシーク操作(パイプなど)。
EROFS 読み取り専用ファイルシステムで何かを変更しようとしました。
EPIPE 壊れたパイプ;パイプのもう一方の端から読み取るプロセスはありません
ENOTSOCK ソケットが必要なときに、ソケットではないファイルが指定されました。
ENETUNREACH リモートホストを含​​むサブネットに到達できなかったため、ソケット操作が失敗しました。
ENETRESET リモートホストがクラッシュしたため、ネットワーク接続がリセットされました。
ECONNABORTED ネットワーク接続がローカルで中止されました。
ECONNRESET リモートマシンの再起動や回復不能なプロトコル違反など、ローカルホストの制御外の理由でネットワーク接続が閉じられました。
ENOBUFS I/O操作用のカーネルのバッファはすべて使用中です。 GNUでは、このエラーは常にENOMEMと同義です。ネットワーク運用からどちらか一方を取得する場合があります。
EISCONN すでに接続されているソケットを接続しようとしました。接続を参照してください。
ENOTCONN ソケットは何にも接続されていません。最初にデータの宛先を指定せずに、ソケットを介してデータを送信しようとすると、このエラーが発生します。
EDESTADDRREQ ソケットにデフォルトの宛先アドレスが設定されていません。最初にconnectを使用してデータの宛先を指定せずに、コネクションレス型ソケットを介してデータを送信しようとすると、このエラーが発生します。
ESHUTDOWN ソケットはすでにシャットダウンされています。
ETIMEDOUT タイムアウトが指定されたソケット操作は、タイムアウト期間中に応答を受信しませんでした。
ECONNREFUSED リモートホストがネットワーク接続の許可を拒否しました(通常、要求されたサービスを実行していないため)。
EHOSTDOWN 要求されたネットワーク接続のリモートホストがダウンしています。
EHOSTUNREACH 要求されたネットワーク接続のリモートホストに到達できません。
ENOTEMPTY ディレクトリが空ではありません。空のディレクトリが予期されていました。通常、このエラーは、ディレクトリを削除しようとしたときに発生します。
EPROCLIM これは、フォークを試行すると、新しいプロセスのユーザーごとの制限を超えることを意味します。 RLIMIT_NPROC制限の詳細については、リソースの制限を参照してください。


  1. Rubyでの挿入ソートを理解する

    注:これは、Rubyを使用したさまざまなソートアルゴリズムの実装を検討するシリーズのパート4です。パート1ではバブルソート、パート2では選択ソート、パート3ではマージソートについて説明しました。 データを並べ替えるためのさまざまな方法を引き続き検討するため、挿入並べ替えに目を向けます。挿入ソートが好きな理由はたくさんあります!まず、挿入ソートは安定です。 、これは、等しいキーを持つ要素の相対的な順序を変更しないことを意味します。 インプレースアルゴリズムでもあります 、は、並べ替えられた要素を格納するための新しい配列を作成しないことを意味します。最後に、挿入ソートは、すぐにわかるように、実

  2. WordPress のファイル構造とデータベースを理解するための初心者向けガイド

    通常、WordPress のファイル構造について気にする必要はありません。 . WordPress には優れた wp-admin インターフェースがあり、エンジンが内部でどのように機能するかを知らなくても、サイトの運営に集中できます。 ただし、サイトの要点を知っておくと役立つ場合があります。これは、予期しない問題が発生した場合に特に当てはまります。 、およびすべてのヘルプは、特定の WordPress ファイルの変更またはデータベース内の値のリセットについて説明しています。 問題が発生していなくても、バックアップやセキュリティについて調べている可能性があります。コア ファイルとデータベ