開発者が予めエラーを想定し、想定したエラーが発生したときに行う処理を例外処理と呼び、
その想定したエラーを例外と呼びます。そして、その例外にphpに予め組み込まれているexceptionクラスとその子クラスのインスタンスを送ることを例外が投げられた、と言います。
例外"が"ということは、エラーが投げられたということでしょうか。
インスタンスを送信しているので、exceptionが投げられたのほうがシックリくるのですが、なぜ例外"が"投げられたというのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
昔からの、IT系の変な翻訳のまま、というところでしょうか。
実際のコード上で例外を投げる(想定外の処理が発生したので処理を、通常の流れから変える)という実装が、
throw new exception
と、プログラムで記載します(言語によっていろいろ違いますが)ので、
これを、そのまま翻訳すると、
新しい例外を投げる
ってな感じに翻訳できるので、おそらく例外という概念が浸透しはじめた当初の頃、どこかの翻訳がそのようになっていて(プログラミング言語C++あたりにでも書いてあるのか?)そのまま、現在まで使われているのかと。
意味的にも、プログラマさんたちが、「投げる」というところで、通常処理以外に、とんでいっちゃう、みたいなイメージもつかみやすく、だからといって、当時は新しい概念ですので、他に候補もなく、といったところでは。
また、例外処理が、
try{ throw new exception(e); }catch(e){ }
と、投げられてた例外を
catch
するというところも、まさに、例外情報を、投げる&つかまえる、みたいな、そんなイメージがぴったりだったり。
てな、私的な雑談でした。
投稿2016/04/22 04:16
総合スコア1283
0
「例外」が「exception」の訳語です。なので、「例外が投げられた」と「exceptionが投げられた」は、この場面では全く同じ意味です。
投稿2016/04/21 12:26
編集2016/04/21 23:59総合スコア84533
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
以下、PHP に限らない、手続き型のプログラミング言語一般の話です。
「例外」=「想定内のエラー」というのはちょっと違うかもしれません。
例外処理の要諦は、異常状態の処理と大域脱出にあると考えています。
ある関数やメソッドの中では、何らかのひとまとまりの処理を行うわけですが、その「通常処理(業務ロジックって言ったりもする)」ができないような「異常状態」も存在するわけです。頑健性のあるシステムを構築するには、異常状態への対処もしなければならないわけですが、関数内に異常状態に対する処理と本来の通常処理が混在した形になっていると、通常処理の流れがわかりにくくなり、実装上・仕様上のバグに気づきにくくなるし、業務ロジックの変更についていくの困難になってしまいます。そこで、異常状態を検出したら通常処理の流れから飛び出すように書ける、というのが例外機構を備えたプログラミング言語の利点なわけです。
余談ですが、手続き型のプログラミング言語において、「通常処理の流れから飛び出す」もう一つの仕組みが return 文です。例外機構を持たないプログラミング言語では、異常状態を検出したらその異常状態を表すものを return しちゃう、という書き方をすることで、異常状態の処理と通常処理とをわけることができます。
大域脱出というのは、通常のフローでは (return 文によって) 関数の呼び出し元にしか戻れないところ、呼び出し元の呼び出し元の呼び出し元の ... 呼び出し元まで一気に戻れる、ということです。言い方を変えると、飛んできた例外を捕まえる (捕捉する、catch する) 記述をしてあるところまで一気に戻ることができるわけですが、一気に戻るための記述が例外を投げる (throw) という表現になるわけです。
最初に戻ります。エラーとは何か、異常とは何か、という定義問題にもなってくるわけですが、「通常処理ができない条件」というのをとりあえずここでは「異常」と言ったわけですが、それは必ずしも「エラー」ではないことも多いわけです。「通常処理」のフローをきれいに書くために、「通常処理ができない条件」への対処を分離して書くのが例外処理です。
大域脱出できる、という点に着目し、(全然エラーじゃないし、「異常」でもないようなケースで)フロー制御の一部として利用する方法もあります。
たとえば、forEachPerson()
という、管理している person
について繰り返しコールバック関数を適用するような関数があって、次のように使えるとします。
php
1forEachPerson(function($person) { 2 echo $person['id'] . ':' . $person['name']; 3});
このとき、id
がある値以上になったら繰り返しを中断したい、というときに例外を使って
php
1try { 2 forEachPerson(function($person) { 3 if ($person['id'] > 100) { 4 throw new Exception('id が 100 超えたんで途中で抜けるよ'); 5 } 6 echo $person['id'] . ':' . $person['name']; 7 }); 8} catch (Exception $e) { 9 // do nothing 10}
例外処理は一般的に重いので、速度が要求されるところで気軽に使うのは考えものかもしれませんが。
投稿2016/04/22 00:07
総合スコア2468
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2016/04/21 12:05
総合スコア5572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
exceptionを投げた、exceptionが投げられた、という人もいます。
「えくせぷしょん」よりも音が短い「れいがい」のほうが好まれるのではないでしょうか。
プログラマはめんどくさがりなので。
例外が出た、とか、例外が起きた、とかの言い方もしますが、throwなので「投げた」が通じやすいです。
ご質問の内容とマッチしないかもしれませんが、「が」を強調なさっているので念の為。
「を」と「が」の使い分けは受動態か否かの問題です。
投稿2016/04/21 23:53
編集2016/04/22 00:32総合スコア247
0
細かい話ですが…
その想定したエラーを例外処理と呼びます。
想定したエラーに基づき対応するものを例外処理といいます。
「例外処理に遷移した」の方が実状にそってるかも?
投稿2016/04/21 12:19
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。