2016-10-26 16 views
3

私は、ユーザコードから導出された例外をスローすることは悪い習慣であると指摘しています。OutOfMemoryExceptionをアプリケーションコードの良いデザインから投げています

GPUを使用するネイティブライブラリがあります。 GPUのメモリが不足していることを示すエラーコードを返すことがあります。このエラーコードを.Net例外に変換する必要があります。 appropiateテキストで1が最高とされる(例外InvalidOperationExceptionをもと)

  • カスタム例外
    1. System.OutOfMemoryException
    2. System.InvalidOperationException

      これは私が考えることができる可能性のある例外ですどうして?

    +0

    3非常に良い答えを@彼が最低限のポイントを持っていたので、ゲオルグのもの... – sanosdole

    答えて

    1

    OutOfMemoryExceptionを上げることが最悪の選択です。その理由は、この例外は一般的なケースではほとんど回復できないため、クライアントにとっては、システムがメモリ不足になったのか、この例外タイプを乱用したのかを判断することは非常に困難です。この動作が期待されます。

    InvalidOperationExceptionを呼び出すことは、クライアントがこれを(他の場所に計算を負担したり、CPU内に必要なものを実行したり、潜在的に別のライブラリを使用して)処理できるため、より良いことです。ただし、例外がInvalidOperationExceptionの場合、この例外タイプは他のライブラリでも使用されている可能性が高く、BCLで使用されている可能性があります。したがって、クライアントは、信頼性の低いエラーメッセージを解析することによってこの例外に対応する必要があります。

    したがって、クライアントがこの例外タイプをキャッチしてこの状況から回復するか、問題が何であるかをユーザーに伝えることができるため、最適なソリューションはカスタム例外タイプです。これが無効な操作の特別なケースであるかどうかは、あなた次第です。個人的には、例外をInvalidOperationExceptionから継承するのではなく、Exceptionから直接継承するようにします。

    3

    投げるSystem.OutOfMemoryExceptionは理想的な選択ではありません。ライブラリを使用しているプログラマは、メモリから不要なオブジェクトの一部をパージしてもう一度試して、System.OutOfMemoryExceptionに反応する可能性があります。しかし、あなたの場合はGPUメモリで、システムメモリではないので、彼らの試みはうまく動作しません。

    GPUメモリから直接的または間接的にオブジェクトをアンロードするオプションがある場合、カスタム例外アプローチ(3番)は最もクリーンな選択肢です。コントロールが全くない場合、つまり例外的に基本的に「あなたが死んでいる」というメッセージの場合は、System.InvalidOperationExceptionも良い選択です。

    1

    スローされた例外は有益で、その者は、候補者を探してみましょう必要があります。

    • あなたが拡大しようとしている。

      System.OutOfMemoryException 
      

      https://msdn.microsoft.com/en-us/library/system.outofmemoryexception(v=vs.110).aspx

      アンのOutOfMemoryException例外は、2つの主要な原因がありますStringBuilder.MaxCapacityプロパティで定義された長さを超えたStringBuilderオブジェクト。

    • 共通言語ランタイムは、操作を正常に実行するために十分な連続したメモリを割り当てることができません。この例外は、 のメモリ割り当てを必要とするプロパティの割り当てまたはメソッド呼び出しによってスローされ、 になる可能性があります。 OutOfMemoryException例外の原因の詳細については、「メモリ不足」が 物理メモリを参照していないを参照してください。

    これを読んだ私はSystem.OutOfMemoryExceptionは非常に間違った候補であると思う:それ誤解あなたのケースで問題がGPUないとRAMであることから。

    二candiadateは

    System.InvalidOperationException 
    

    https://msdn.microsoft.com/en-us/library/system.invalidoperationexception(v=vs.110).aspx

    メソッド呼び出しが オブジェクトの現在の状態に対して無効な場合にスローされる例外です。

    もう1つmiss;状態はOKです。十分なメモリがないGPUです。

    だから私は、あなたが、しかし、抽象GpuException経由System.InvalidOperationExceptionではなくExceptionのベースませんカスタム例外所有して実装するお勧め:私が選んだ:)非常に短い時間で

    Exception 
        GpuException    // Abstract (wrong GPU, lack of support etc.) 
         GpuOutOfMemoryException // Not enough memory on board 
    
    関連する問題