20081120 lt11th ace
TRANSCRIPT
![Page 1: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/1.jpg)
ECAあなたとは 違うんです
エラー処理
2008年11月20日(木)第11回Lightning Talk
林 正紀id:m_norii
![Page 2: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/2.jpg)
というわけでPHPの
エラー処理のお話です
![Page 3: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/3.jpg)
ところでエラー処理
ちゃんとしてますか?
![Page 4: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/4.jpg)
CASE1 : 放置
$filename が存在しないとE_WARNINGが出る
![Page 5: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/5.jpg)
CASE2 : 黙殺
E_WARNINGうざいからとりあえず抑制した。。。
![Page 6: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/6.jpg)
論外
![Page 7: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/7.jpg)
CASE3 : 比較的まともな例
・ファイルの存在チェックをしてる・各関数でFALSEが返ってきた場合をケア
![Page 8: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/8.jpg)
でも、いちいちif(($handle=fopen($file))===FALSE)
とかor die(’Error!’)
とか面倒。
![Page 9: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/9.jpg)
なのでエラーハンドラを
使いましょう
![Page 10: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/10.jpg)
定義側:定義側:
利用側:
詳しい使い方はPHPマニュアル参照。
![Page 11: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/11.jpg)
CASE4:PEARのエラー処理
![Page 12: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/12.jpg)
てか、PEAR::isError()
ばっかでうざいし。。。orz
![Page 13: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/13.jpg)
でも大丈夫!
![Page 14: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/14.jpg)
PEARにもエラーハンドリング機構が
あるよ(^^)v
![Page 15: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/15.jpg)
PEAR::setErrorHandling()
![Page 16: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/16.jpg)
あとはさっきの要領で、ErrorHandlerクラスにエラー時に実行する handlePEARError() メソッドを定義するだけ。→エラー処理が消えて、読みやすい ソースコードになったよ!
![Page 17: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/17.jpg)
ところで
![Page 18: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/18.jpg)
PEARって「クラス」ライブラリ
ですよね?
![Page 19: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/19.jpg)
だったらエラーも「例外」で
処理しませんか?PHP5限定だけど・・・
![Page 20: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/20.jpg)
PEAR_ErrorをPEAR_Exceptionに詰め替えてthrowするラッパを作る
※元ネタは [PHP-users 25583]のMLより。
![Page 21: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/21.jpg)
さらにPHPのデフォルト例外ハンドラも定義しておく
![Page 22: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/22.jpg)
そして、利用する時はこんな感じ。
![Page 23: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/23.jpg)
あとは、冒頭のset_error_handler();
とかも、auto_prepend_file に指定して
コードから追い出しちゃう・・・って手もありますが。
・・・そこは好き好きに。(^^;;;
![Page 24: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/24.jpg)
まだまだエラー処理について
語るべきことは多いのですが・・
![Page 25: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/25.jpg)
たぶんタイムアップ寸前なので
(^^;;;
・・・さわりだけ
![Page 26: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/26.jpg)
【大事なこと1】Webページのエラー処理と
コマンドラインのエラー処理はちゃんとわける
maillog に HTMLのエラーページが出力されてるとか、ありえないし。。。orz
![Page 27: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/27.jpg)
【大事なこと2】エラー処理は、最初に設計・実装!
いわゆる「横断的関心事」だから、後で付け足そうと思うと結構めんどくさいので。
![Page 28: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/28.jpg)
【大事なこと3】php.iniの設定、要確認!!
本番環境で display_errors = On とかはずかしいぞ!
![Page 29: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/29.jpg)
【大事なこと4】ApacheのErrorDocumentも
準備しておこうデフォルトのエラーページはかっこわるい(もちろんセキュリティ・ユーザビリティ的にも好ましくない)
![Page 30: 20081120 lt11th ace](https://reader033.vdocuments.pub/reader033/viewer/2022042818/55aeda3f1a28ab1d3c8b4778/html5/thumbnails/30.jpg)
ご静聴ありがとうございました