update.PHPのSPL系組み込み例外は全部で13個あるんですが、正直、使い分けがよく分かりませんでした。公式ヘルプを見ても、わかったような、わからんような。(全部うしろにExceptionって付くので省略してます)Logic系BadFunctionCallBadMethodCallDomainInvalidArgumentLengthOutOfRangeRuntime系OutOfBoundsOverflowUnderflowRangeUnexpectedValue名前の似ているOutOfRangeとOutOfBoundsが全然違うって辺りが罠。いうときに使われるのかをPHP本体のソースコードからgrepしてみます。そもそも、SPLというオブジェクト指向のライブラリを作る上で導入されたのがSPLの例外だったはずだから、本家の使い分けが一番信用に足るはず。ソースコードはPHP7.1を使っています。Logicプログラムのロジック内でのエラーを表す例外です。この類の例外が出た場合は、自分が書いたコードを修正すべきです。「てめーの使い方がおかしーんだよ」という意味合い。普通発生しない、発生したらコードを直すはずなので、catchしないのがお約束。SPL内でも直接throwされていることがある。(%s)"以下の例外には当てはまらないのだけど、使い方がおかしいことを伝えるために使う。「parent::__construct()を呼び忘れてるせいで、オブジェクトが変な状態になってるよ」というのは面白い。BadFunctionCall未定義の関数をコールバックが参照したり、引数を指定しなかったりした場合にスローされる例外です。throwしてるケースなかった。BadMethodCallの親クラスとしてしか使われてないっぽい。BadMethodCall未定義のメソッドをコールバックが参照したり、引数を指定しなかったりした場合にスローされる例外です。状態によってメソッドを呼ばれたくないようなケースかな。メソッドを呼ばないように修正するべき。ext/以下だと、pharが結構throwしている。twice"「constructorは2回呼べない」これとか面白いね。Domain定義したデータドメインに値が従わないときにスローされる例外です。型は合ってるんだけど微妙に変な値だったとき、みたいな感じか。http://lxr.php.net/search?q=&defs=&refs=spl_ce_DomainException&path=&hist=&type=&project=PHP-7.1使われてるの一箇所だけだった。zero"SplFileObject->setMaxLineLen()にマイナスの数字を渡すと発生。InvalidArgument引数の型が期待する型と一致しなかった場合にスローされる例外です。型が間違っていたら投げる。PHP7未満だとscalar型のチェックと併せて使うだろうし、PHP7以降ももう少し複雑な型を使いたい場合は使ってもいいかもしれない(AかつBのinstanceofであるオブジェクト、などは今も記述できない)SPLとPharが一部発生させている。zero"なんかは、DomainExceptionの例と同じですね。使い分けがしっかりしてないみたい。Length長さが無効な場合にスローされる例外です。使われてるところ見つからなかった。OutOfRange無効なインデックスを要求した場合にスローされる例外です。これは、コンパイル時に検出しなければなりません。\ArrayAccess的なクラスを想定してて、コンパイル時判定できるような無効インデックスが指定されたら投げる。intlとSplDoublyLinkedListなどなど。constant"と思ったのだが、Offsetが範囲より大きい場合、なんていうのはコンパイル時検出なんてできるのかコレ...??Runtime実行時にだけ発生するようなエラーの際にスローされます。考えると不思議な説明文だ...。例外とは実行時に発生するものに決まっているだろうに。キャッチして対処するべき?ただ、見てる感じだと「それはバグだろ...」感のあるものも多い。投げているところは結構ある。this"file系は何となく納得感あるかな。OutOfBounds値が有効なキーでなかった場合にスローされる例外です。これは、コンパイル時には検出できないエラーです。型は合ってたけどデータ的にはみ出てるケースかな。iterator系でいくつかある。Overflowいっぱいになっているコンテナに要素を追加した場合にスローされる例外です。試みたときにスローされる例外です。Rangeプログラムの実行時に範囲エラーが発生したことを示すときにスローされる例外です。通常は、アンダーフローやオーバーフロー以外の計算エラーが発生したことを意味します。UnexpectedValueいくつかの値のセットに一致しない値であった際にスローされる例外です。ことを想定している場合があります。関数の中で関数を呼んだところ、結果が変。そんなときに使うという感じか。}//...}普段はいちいちチェックしないだろうけど、こんな風にcallableを渡してもらい中で実行するなら、出自が胡散臭いのでちゃんとチェックしそう。これも返り値型宣言によってある程度減らせるような気がする。pharでいっぱい出てきた。filter)"よく分からなくなってきた。PHPの言語仕様的には、チェック例外というものは存在しないです。Throwableなクラスであれば何でもthrowできます。発生しうる例外はキャッチしてもいいし投げ抜けても問題ありません。Exceptionの下の例外に何か明確な使用ルールがあるかというと、言うほど明確なルールはなさそうに見えます。致命的なもの、メモリが足りないとかはError系で飛んで行くので、RuntimeExceptionをcatchしてれば大丈夫というわけでもなく、うーん。Go界隈をうろうろしています。最近はgRPCと戦ってる。出典表示無しで自由にコピペして頂いて構いません。記事自体をコピペされるのは嫌なので、ソースコード部分以外の文章は通常通り全ての著作権を私が保持するものとします。引用を超える範囲のコピペは止めて下さい。http://blog.tojiru.net/FollowMercariフリマアプリ「メルカリ」を、グローバルで開発しています。