1

モジュラー アプリケーションを開発する場合、 Fail-fastシステムを使用する必要があることは明らかですか?

モジュールが処理できないエラー状態がある場合にモジュールを作成する場合、誰がそれを処理するかを心配することなく、エラーを報告する必要があります (例外をスローするなど)。モジュール開発の目安になりそうです。これに問題はありますか?

編集:例

module.dll 内

public class SomeClass:ISomeInterface
{

    public void CreateFile(string filename)
    {
       //The module have no idea who calls this. But there is something wrong        
       //somewhere so  throw an exception early. The module writer has no control over 
       //how the exception is handled. So if this exception is not handled by the 
       //Client Application the application can potentially crash.Do he need to worry 
       //about that?
       if(filename == null)
       {
          throw new ArgumentNullException("Filename is null");
       }

       //I think the following is bad. This code is making sure that a module 
       //exception wont crash the application.Is it good?
       //if(filename ==null)
       //{
       //Logger.log("filename is null");
       //return;
       //}
    }
 }
4

3 に答える 3

2

私が見ることができる重大な例外には 2 つのカテゴリがあります。システム全体が侵害された可能性があり、そうではないと安全に想定できるものはほとんどないものと、システムの重要な側面であるコードが実行されているものです。 「正常に機能する」と期待するのは無理ですが、システムの他の部分が侵害されていると信じる理由はありません。前者の場合、死ぬ以外にプログラムができることはあまりなく、「メインライン」データを壊さずにログを記録できる場合は、何が起こったのかをログに記録しようとする可能性があります。ただし、後者の場合、アプリケーションを強制終了することは、過度に「失礼」になります。より良いアプローチは、サブシステムを設計して、コードが「プラグを抜いて」データの破損を防ぐことができるようにすることです。

于 2012-04-24T16:49:44.203 に答える
1

フェイルファストモジュールは、エラーを処理する責任を負いますが、エラーを検出することはなく、次に高いシステム設計レベルに移ります

ウィキペディアの定義から。「次に高いシステム設計レベル」とは正確には何ですか。誰かが修正措置を講じて問題を修正できるように、少なくとも障害を報告するレベルではないでしょうか。クラスを使用するクライアントコードによって提供される上位層に実装されます。または、AppDomain.UnhandledExceptionを介して呼び出される一般的なエラーレポーター。両方とも完全にあなたのコントロールの外にあります。

例外をスローします。

于 2012-04-24T12:02:11.373 に答える
0

通常、C++ で一般的にクリティカル エラー スキームを実装する場合、そのようなクリティカルな例外が例外ハンドラーから離れないようにします。グローバルにアクセス可能なクラス インスタンスの 'criticalExit()' メソッドを呼び出します (通常、これらは、「グローバル」メソッドなど (ロガー、オブジェクト プールなど) を保存するためのものであり、例外と文字列 (多くの場合、モジュールと関数名のみの文字列) を含みます。criticalExit() はミューテックスをロックし、その優先度を「THREAD_PRIORITY_TIME_CRITICAL」に上げ、「CriticalError.Log」を開き、例外メッセージと文字列をファイルに追加して閉じ、ExitProcess(1) を呼び出します (Environment.Exit(1)) .

..そして、確認のために、C# でこれを実行してみました。グローバルにアクセス可能な単一のインスタンスを生成するのは簡単ではありません:(

于 2012-04-24T11:49:57.843 に答える