2016-10-18 14 views
1

私は困惑しています。 AccessViolationExceptionは、第三者のライブラリによってランダムに生成されます。それは安全に無視することができますので、[HandleProcessCorruptedStateExceptions]属性の呼び出しメソッドをhereとしてラップしています。HandleProcessCorruptedStateExceptionsにもかかわらずAccessViolationExceptionがキャッチされない

しかし、私はまだ下に表示として育てなった例外を見ています: enter image description here

私は、.NET Frameworkの4.6.2およびVisual Studio 2015を使用しています更新3.私は何を見逃しているだろうか?

+0

[HandleProcessCorruptedStateExceptions]は、渡されるオブジェクトが何であっても動作しませんか?どのように重要ですか? –

+1

Erm、待って、それは働いた。例外は、CSEが通常行うようにプログラムを終了しませんでした。あなたはその属性で例外を処理すると約束しましたが、そうしなかったのです。属性を悪用しないように注意してください。そのサードパーティのライブラリを再度呼び出すことはできません。そのためには、まともなエラーレポート(AppDomain.UnhandledExceptionイベントを登録)でプログラムを終了するか、そのライブラリへのそれ以上の呼び出しを抑制する静的ブール変数を設定する必要があります。デバッガは、イベントが発生する前に必ずステップインすることに注意してください。 –

+0

@HansPassantあなたは間違いなし! (実際には、ほとんどの場合、これは誇張されていません。私の意見では、ここで一番賢い人の1人です。) 'AccessViolationException'の後、プロセスを終了する以外は何も本当に安全です。私は、この例外を無視するのが安全であるとOPが述べたので、あなたの予防措置の警告は言及していませんでした。 (私は彼が既に例外の理由を分析していたと仮定した。) – haindl

答えて

1

try/catchを約table.Start()に挿入するのを忘れました。

[HandleProcessCorruptedStateExceptions]AccessViolationExceptionをキャッチするには、間違いなくtry/catchが必要です。

だからあなたのコードは次のようになります。

[HandleProcessCorruptedStateExceptions] 
private static void StartTable(Table table) { 
    try 
    { 
     table.Start(); 
    } 
    catch (AccessViolationException) 
    { 
     // Ignore 
    } 
} 

あなたが参照のためにhereまたはhereを見てみることができます。

+0

ありがとう!私は 'try/catch'ブロックをインクルードしましたが、' StartTable'を呼び出すメソッドに含まれていました。 –

+1

@ErwinMayerよろしくお願いします! :-)はい、 'try/catch'は' [HandleProcessCorruptedStateExceptions] 'がセットされたメソッドの中に直接存在する必要があります。 (どのような種類の代理人も、CLRの観点からは別の方法です)。 – haindl

関連する問題