カスタム例外メッセージ。ベストプラクティス
質問
例外メッセージを作成する際に、デバッグに役立つ情報を強制するためにどの程度の努力をすべきか、あるいは、ユーザーが正しい情報を提供することを信じるべきか、あるいは、情報収集を例外ハンドラに委ねるべきか、疑問に思っています。
私は、多くの人々が彼らの例外をこのように行うのを見ます。
throw new RuntimeException('MyObject is not an array')
または、デフォルトの例外を、例外の名前を変えるだけで、たいしたことはしないカスタム例外で拡張することもできます。
throw new WrongTypeException('MyObject is not an array')
しかし、これはあまりデバッグ情報を提供しませんし、エラーメッセージの書式を強制するものではありません。そのため、まったく同じエラーが2つの異なるエラーメッセージを生成してしまう可能性があります...例えば "Database connection failed" vs "Could not connect to db"
確かに、もしそれが一番上に泡立つなら、それはスタックトレースを表示するでしょう、それは便利ですが、それは常に私が知る必要があるすべてを教えてくれるわけではありません。
私は以下のコードのようなものについて考え始めています。 を必要とする。 を要求し、正しいエラーメッセージを生成するために必要な引数を例外のスローワーに供給します。これはその中で行くべき方法かもしれないと考えています。
- 最低レベルの有用な情報が提供されなければならない
- ある程度一貫したエラーメッセージを生成する
- 例外メッセージのテンプレートはすべて1つの場所(例外クラス)にあるため、メッセージの更新が容易...
しかし、使いにくい(例外の定義を調べなければならない)という欠点もあり、他のプログラマが提供された例外を使うことを躊躇してしまうかもしれません...。
一貫性のある、柔軟な例外メッセージフレームワークのためのベストプラクティスです。
/**
* @package MyExceptions
* MyWrongTypeException occurs when an object or
* datastructure is of the incorrect datatype.
* Program defensively!
* @param $objectName string name of object, eg "\$myObject"
* @param $object object object of the wrong type
* @param $expect string expected type of object eg 'integer'
* @param $message any additional human readable info.
* @param $code error code.
* @return Informative exception error message.
* @author secoif
*/
class MyWrongTypeException extends RuntimeException {
public function __construct($objectName, $object, $expected, $message = '', $code = 0) {
$receivedType = gettype($object)
$message = "Wrong Type: $objectName. Expected $expected, received $receivedType";
debug_dump($message, $object);
return parent::__construct($message, $code);
}
}
....
/**
* If we are in debug mode, append the var_dump of $object to $message
*/
function debug_dump(&$message, &$object) {
if (App::get_mode() == 'debug') {
ob_start();
var_dump($object);
$message = $message . "Debug Info: " . ob_get_clean();
}
}
のように使われる。
// Hypothetical, supposed to return an array of user objects
$users = get_users(); // but instead returns the string 'bad'
// Ideally the $users model object would provide a validate() but for the sake
// of the example
if (is_array($users)) {
throw new MyWrongTypeException('$users', $users, 'array')
// returns
//"Wrong Type: $users. Expected array, received string
}
で、html出力に適したものにするために、カスタム例外ハンドラでnl2brのようなことを行うかもしれません。
読書中。 http://msdn.microsoft.com/en-us/library/cc511859.aspx#
といった記載はないので、もしかしたらダメなのかもしれませんが...。
どのように解決するのですか?
のアドバイスを強くお勧めします。 Krzysztofのブログ にあるアドバイスを強くお勧めします。また、あなたのケースでは、彼が Usage Errors と呼んでいるものに対処しようとしているようなので、注意してください。
この場合、必要なのはそれを示す新しい型ではなく、それを引き起こしたものについてのより良いエラーメッセージです。そのようなものとして、どちらかのヘルパー関数があります。
- 例外に配置するテキスト文字列を生成する。
- 例外とメッセージ全体を生成します。
は必要なものです。
アプローチ1はより明確ですが、少し冗長な使い方につながるかもしれません。2はその逆で、より明確でないためにより短い構文を取引します。
関数は非常に安全でなければならず(それらは決して、無関係な例外を自ら引き起こしてはなりません)、特定の妥当な使用においてオプションであるデータの提供を強制してはならないことに注意してください。
これらのアプローチのいずれかを使用することにより、必要であれば、エラーメッセージを後で国際化することが容易になります。
スタックトレースは最低でも関数と、おそらくは行番号を与えます。したがって、そこから容易に判明しない情報を提供することに焦点を当てるべきです。
関連
-
phpのAllowed memory size of 134217728 bytes枯渇問題の解決法
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み] Pythonの関数が例外を投げるかどうかをテストするにはどうすればよいですか?
-
[解決済み] Laravelでカスタムヘルパー関数を作成する方法
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】PHPで空の値からデフォルトオブジェクトを作成する?
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】stdClassクラスのオブジェクトが文字列に変換されない。
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
phpのAllowed memory size of 134217728 bytes枯渇問題の解決法
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み】phpのシンタックスエラー、予期しないT_IFエラーを修正する方法は?[クローズド]。