失敗を示すためのJavaScriptアンチサイレントテクニック
-
16-09-2020 - |
質問
NULLに頼る代わりに、JavaScriptでエラーを報告する良い方法で、エラーが発生しているときに未定義が進められず、機能が進んでいないことがよくあります。私は3つのアプローチを考えることができます:
- 何もしない
- 例外を投げる
- アサート
これは単純なシナリオです。関数credit
は、Account
オブジェクトの一部です。
これがナイーブソリューションです。
function credit(amount) {
this.balance += amount;
}
.
このアプローチの主な問題は無効なデータです。それを修正しましょう、操作が失敗したことを示すために戻り値を使用してください。
function credit(amount) {
if(!isInt(amount)) {
return false;
}
this.balance += amount;
}
.
これは前のものよりも改善ですが、クライアントコードは戻り値をチェックして、操作が成功したことを確認する必要があります。基本的にシステム内のすべての方法では面倒になることがあります。
if(!johnDoe.credit(100)) {
// do some error handling here
}
.
2番目の方法と同様の3番目のアプローチは例外をスローすることです。私たちが例外を投げているので、一般的なものではなく特定の種類の例外をスローすることができます。
function credit(amount) {
if(!isInt(amount)) {
throw new InvalidAmountError(amount);
}
this.balance += amount;
}
.
スローさせることと同様の4番目のアプローチは、コード内のアサーションを使用することです。上記のアプローチと比較して1つの欠点は、アサートが一般的なので、カスタム例外をスローする能力を失います。オブジェクトを各アサート呼び出しに投げることによって、それはまだ可能です。
function credit(amount) {
assert(!isInt(amount), "Amount to credit is not an integer");
this.balance += amount;
}
.
グローバルassert
関数は書き込みが簡単で、コードを少し短くします。
function assert(value, message) {
if(value !== true) {
throw new AssertionError(message);
}
}
function AssertionError(message) {
this.message = message;
}
AssertionError.prototype.toString = function() {
return 'AssertionError: ' + this.message;
}
.
これらのアプローチのうち、予期しない値と不幸な経路に対処するための良い方法があるでしょう。ここでは誰もいない他のアプローチがありますか?
解決
log4js などのエラーを報告するためのクライアント側のロギングフレームワークを検討してください。アプリケーションによっては、ブラウザ内のメッセージ(すなわち、情報、デバッグ、警告、エラー)をログに記録することも、メッセージをAJAXを介してサーバーに永続化することもできます。
LOG4JSサイトは、その他のJavaScriptロギングフレームワークのリスト
カスタム例外の例を使用して、例外をスローして、フィットするとエラーをログに記録することです。
他のヒント
上記の欠点 アプローチは、アサート以来のものです ジェネリック、私たちは投げる能力を失います カスタムの例外
必ずしもそうしない:
function assert(value,message,Exctype) {
if(value !== true) throw new Exctype(message);
}
.
コンストラクタは機能です。関数は最初のクラス値です。周りに渡してください。