More Related Content
Similar to 90分間濃縮 PHPエラーの教室
Similar to 90分間濃縮 PHPエラーの教室 (20)
More from Yusuke Ando (20)
90分間濃縮 PHPエラーの教室
- 15. エラーの種類
種類 内容
E_ERROR / Fatal 実行不可能:処理は停止、白画面
E_WARNING / Warning 警告:実行時に問題発生、処理は継続
E_PARSE / Parse 解析不能:処理は始まらない、白画面
E_NOTICE / Notice 通知:問題になりうる状況、処理は継続
E_STRICT /
バージョン間の互換性に関するエラー
E_DEPRECATED
重大度に応じてレベルが存在
Shimokita.php / Yusuke Ando (@yando)
- 16. FATAL / NOTICE /
PARSE WARNING etc
何も出ないか、壊れた画面かの分かれ目
Shimokita.php / Yusuke Ando (@yando)
- 17. E_PARSE / Parse
echo echo;
echo date()
echo time()
•トークンの出現位置が不正
•セミコロン忘れ、ブレースの対応関係
•全角スペース混入
シンプルな構文エラー
Shimokita.php / Yusuke Ando (@yando)
- 18. E_ERROR / FATAL
$obj = 1;
if ($obj === null) {
$obj = getObject();
}
$obj->myFunc();
•構文は合っていたが、実行しようとした処理が失敗
•関数名間違い、オブジェクトの取り違い
•外部モジュールのエラー
コードが実行された時の状態が問題
Shimokita.php / Yusuke Ando (@yando)
- 19. E_WARNING
$body = file_get_contents( hoge.txt );
echo Hello ;
•処理は実行できたが、失敗してしまった場合
•ファイルやネットワークの処理など
•正常に処理を継続する事はおそらく難しい
エラーを検知してふさわしい処理が必要
Shimokita.php / Yusuke Ando (@yando)
- 20. E_NOTICE
if ($data == null) {
echo Hello ;
echo HOGE;
}
•未定義の変数、定数を使った場合
•関数への引数が正しくない
•考慮の足りないコードで発生しやすい
動いていたとしても危険性あり
Shimokita.php / Yusuke Ando (@yando)
- 21. E_STRICT / E_DEPRECATED
class Sample
{
function foo()
{
echo "Hi";
}
}
Sample::foo();
•PHP4の文法をPHP5で利用した場合
•将来廃止される予定の機能を使った場合
古い遺産で発生しやすく、不可避な場合も
Shimokita.php / Yusuke Ando (@yando)
- 25. 正しい設定
error_reporting = E_ALL
display_errors = On
display_startup_errors = On 全てを検知、表示
log_errors = On
error_log = /path/to/error.log
error_reporting = E_ALL & E_DEPRECATED & E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
互換性エラーは無視
error_log = /path/to/error.log
表示はしない
Shimokita.php / Yusuke Ando (@yando)
- 28. これもダメ
<?php
@trigger_error("Hi");
echo "World";
強制的に無視
これを多用すると障害発生時に手がかり0
Shimokita.php / Yusuke Ando (@yando)
- 31. エラーハンドリングの例
function handler($no, $str){
echo "Error $strn";
return true;
}
set_error_handler('handler');
echo $a;
trigger_error('My Error');
•エラーの情報を引数で受け取る
•returnで元の場所へ復帰する
標準の処理以外の対応が可能
Shimokita.php / Yusuke Ando (@yando)
- 33. エラーハンドリングの後
$body = file_get_contents( hoge.txt );
if ($body === false) {
my_error();
exit;
}
echo Hello ;
•処理が継続するWarningやNoticeの後には適切な処理
•不足すると空っぽのリスト、崩れた画面などに繋がる
ハードな運用を耐えているかの試金石
Shimokita.php / Yusuke Ando (@yando)
- 37. 例外処理の例
function hoge()
{
if (true) {
throw new Exception('Error!');
}
}
try {
hoge();
} catch (Exception $e) {
echo $e->getMessage();
exit;
}
例外オブジェクトをthrowするとcatchに入る
Shimokita.php / Yusuke Ando (@yando)
- 39. 例外処理の失敗例
function hoge()
{
if (true) {
return new Exception('Error!');
}
}
try {
hoge();
} catch (Exception $e) {
echo $e->getMessage();
exit;
}
例外オブジェクトをreturn...
Shimokita.php / Yusuke Ando (@yando)
- 40. 例外処理の失敗例2
function hoge()
{
if (true) {
throw new Exception('Error!');
}
}
try {
hoge();
} catch (Excepton $e) {
echo $e->getMessage();
exit;
}
catchする例外の型が合っていない
Shimokita.php / Yusuke Ando (@yando)
- 41. 例外処理の失敗例3
function hoge()
{
if (true) {
throw new Exception('Error!');
}
}
try {
hoge();
} catch (Exception $e) {
}
catchしてもなにもしていない...
Shimokita.php / Yusuke Ando (@yando)
- 43. 例外処理の自動化
function handler($exception) {
echo $exception->getMessage();
}
set_exception_handler( handler );
•catchされなかった例外が最終的に指定した関数へ到達
Shimokita.php / Yusuke Ando (@yando)