2017-06-29 12 views
1

最近、同僚との間で、trycatchを使用してエラーを通知したり、それらを回避する方法について話し合いました。try-catchはエラーを防止または処理するためのものですか? (JavaScriptで)

これは私の同僚のアプローチです:

import Config from 'config'; 

export const getUserFromLocalStorage =() => { 
    const key = Object.keys(localStorage).find(value => value === `${Config.applicationId}/currentUser`); 

    try { 
    return key ? JSON.parse(localStorage[key]) : {}; 
    } catch (e) { 
    return {}; 
    } 
}; 

Wich means, he doesn't care about the given error and he is just carrying of returning an object in order to continue the process

と私は次のようになります。

import Config from 'config'; 

export const getUserFromLocalStorage =() => { 
    const key = Object.keys(localStorage).find(value => value === `${Config.applicationId}/currentUser`); 

    try { 
    return key ? JSON.parse(localStorage[key]) : {}; 
    } catch (e) { 
    console.log('the given error', e); // Just simple notifier for this example 
    } 
}; 

が、私のアプローチは、まだそれがクラッシュすることがundefinedを(返すことで問題があります私のアプリケーションinternaly)、それは簡単にfinallyを使用してそれを修正し、デフォルト値を返すが、それは私には良い練習には聞こえません。


必要であればバランスが自分のアプリケーションを安定させるために、trycatchfinallyを何を使ってますQUESTION


私たちのアプローチに何か問題はありますか?
特に、localStorageのデータを信頼できないため、この実装にはどのような方法が最適ですか?

+4

'は、私のアプリをinternalyにクラッシュさせる可能性があります)'を返します:メソッドが 'undefined'を返すかもしれないことを文書化して、それを呼び出すコードがそれを処理できるはずです。同様に、同僚の空のオブジェクトが呼び出しコードの例外を引き起こす可能性があります。主なことは、何がエラー状態で返されたかを記録し、発信者に何をすべきかを決定させることです。 –

+0

いいえ、エラーケースのデフォルトを返すために 'finally'を使用しません。 – Bergi

+0

@Bergi 'finally'のユーティリティとなるもの – JoseAPL

答えて

-1

私は最も重要なことは、そのユーザー満足度だと思います。その日の終わりに、プログラムは通常のユーザーによって使用されます。ユーザーはプログラムを使用して作業を中断することなく継続する必要があります。

だから私は、ベストプラクティスがある場合はすべてのエラーをコードしてcatchを実行するためにtryを使用し、例外があることを、開発者および/またはユーザに通知し、有効なオブジェクトを返すことによって、例外を克服するためにfinallyを使用することであると思います。

このようにして、ユーザーは作業を続行することができ、開発者は将来のデバッグのためにログファイルのエラーをチェックすることもできます。 これは私の個人的な考えです。

3

finallyは、いずれかの場合にスローされたかどうかにかかわらず実行されるため、デフォルト値を返す場所ではありません。また、エラーを詳細に記録する必要があるかどうかは疑問です。それは何かがの予期されるエラーか本当にの例外的な状況であるかどうかによって異なります。

保存された値が無効なJSONである可能性はありますか?そして、あなたはその場合何をするための "バックアップ計画"を持っていますか?ユーザーや開発者は何もできません。それで誰も気にしないでください。おそらく、console.logにデバッグを助けるかもしれないメッセージがありますが、それ以外はプログラムフローを続行するだけです。 a)ユーザーがアクションを開始しなかった場合、b)ユーザーがそのアクションについて何もしない場合、alertでユーザーをバグさせる必要はほとんどありません。

考慮事項取る:

  1. 最初の場所でエラーをcatchするかどうか:

    • それは当然のプログラムの流れの間に発生する可能性が予想されるエラーですか?
    • あなたは何かできることは間違っていますか?
    • エラーが発生した場合の対処方法はありますか?誰か良いこのログやるん

      • :エラーをログに記録するかどうか
    • 誰でもそのログエントリが表示されますか?
    • 問題の修正につながる有益な情報を誰にも与えてくれますか?何かについて
  2. バグかどうかをユーザー:

    • ユーザーがアクションを開始しましたか?
    • ユーザーは何らかの形式の応答を期待していますか?
    • ユーザーは問題を解決するために何かできますか?空のオブジェクトまたは何も/ null/undefinedを返すかどうかを

機能の責任が何であるかに依存します。関数は常にオブジェクトを返すように定義されていますか?それから、return {}catchです。または、期待されるオブジェクトが存在しないときに「何もない」有効な応答ですか?おそらくreturn falseです。

全体として、あなたの同僚のアプローチは私にとって非常に合理的です。

+0

何らかの理由で無効なJSONオブジェクトが 'localStorage'に存在する場合、空のオブジェクトを返します。' getUserFromLocalStorage'は常に作業して何かを返す(有効)、これは何か「間違っている」?エラーがあったので、私はあなたの説明を理解する。実際には、キーが存在しない場合は空のオブジェクトを返すべきではありません。 私はそれが 'getUserFromLocalStorage'関数の契約内容にかかっていると思います。どう思いますか? :) – JoseAPL

+1

エラーは必ずしも致命的というわけではありません。つまり、プログラムの通常の流れでは、単に黙って(敷物の下に掃除される)扱うことができるエラーが予想されるかもしれません。エラー!==常に警鐘を鳴らします。それを超えて、はい、*あなた*あなたの機能を外部で振る舞う方法を決める。 – deceze

+0

ありがとう、あなたは偉大な説明とユースケースの恩恵に値する:) – JoseAPL

1

この特定のケースでは、localStorage(ほとんどの場合、必然的にJSON.parse()を使用することを意味します)では、try-catchで処理をラップするのがベストプラクティスです。これは、localStorageとJSON.parseの両方がエラー処理の通常の部分として例外を持ち、通常はデフォルト値または初期値に正常にフォールバックすることができるためです。

const DEFAULT_VALUE = {}; 
try { 
    const result = JSON.parse(result); 
    return result || DEFAULT_VALUE; 
} catch (e) { 
    console.warn('Error parsing result', e); 
} 

return DEFAULT_VALUE; 

この方法では、あなたが一貫性のあるエラー処理とデフォルト値のフォールバックを持っている:

私が使用するパターンは、次のようにのようなものです。

一般的に、エラーを安全に処理して有用なフォールバックを生成することができない限り、try-catchを使用する必要はありません。ほとんどのtry-catchブロックは、コールスタックの一番下に座っているため、予期せぬエラーを捕捉し、ユーザーのために優雅に処理します。適切に調査/処理する/回避策。

関連する問題