ログ日記

作業ログと日記とメモ

エラー制御

http://blog.hawklab.jp/item-97.html
こういうめんどくさいことが必要になるのは

  1. 読み込むファイルが存在するかどうかをチェックする
  2. ファイルを読み込む

ということが簡単に書けないからで

if (file_exists($path))
    include $path;

と書ければいいんだけど。誰もが問題だと思うようなことなのに、なんでfopenのようにしないんだろう。





無理矢理解決すると問題が起こる。
演算子は避けるべきだし、ファイルの読み込みを独自実装することも避けるべきだ。


演算子は言わば例外の例外だ。プログラムを処理中に起こる実行時エラーという例外を、更に例外として無視する危険な演算子
エラー制御というものは後から変更される可能性があり、@演算子があるからといってエラーが無視されるとは限らない。
仕様変更などで、error_reporting() == 0 に対するログを取るようなユーザエラーハンドラが実装された場合、@演算子を無視することになる。


ファイルの読み込みという基本的な処理を独自実装することも、あまりよろしくない。
そういう処理はコードの至る所で使われる可能性があるからだ。
問題を起こす可能性を下げるためには、例えば ex_functions.php で標準的な関数を定義した場合、それを利用するファイル全てに

require_once 'ex_functions.php';

と書く。
こうすることで標準ではないグローバル関数を使っているんだという意識が働く。
# 当たり前だという声も聞こえてきそうだが、私はそうじゃなかった。なんでそう思うようになったかと考えると・・・元はC言語だった気がする。マクロを習う前はヘッダファイルを2度読み込むとエラーになるので、どこかで一度だけ読み込んでいた。それがマクロを使うようになっても「間違って二度読み込んでもエラーにならないんだ」くらいの認識だった。今でもこの辺のことはよく分かっていないかも。



これらはユニットテストを書いていると最初に気付く話ではある。
それで、どうしようか迷っている・・。



[Maple-dev: 153] Re: バージョン3.2の開発
私の心境の変化は逆で、今は@include()にすべきかなと段々思えてきた。
それともこれはエラーハンドラが解決すべき?include失敗の時だけエラーハンドラから脱出するとか。
# @をあちこちに書くよりは一カ所で例外処理を入れた方がいいという考え方。


制御構造じゃないinclude()とかあって、失敗してもWarningにならず戻り値だけで判断できたらいいのにな。