■64004 / inTopicNo.1) |
UnhandledExceptionでも補足できない例外? |
□投稿者/ Unripe01 (15回)-(2012/11/01(Thu) 18:45:31)
|
分類:[.NET 全般]
お世話になっております。
C#の例外補足について質問させてください。
開発環境:VS2010
言語 :C#.NET 4.0 にてWindows Formアプリ作成
マネージコード側から"kernel32.dll"のMapViewOfFile関数というものを呼び出す処理を行なってます。
DLL実行中にSystem.Runtime.InteropServices.SEHExceptionという例外が発生しており、
exe実行していると、アプリケーションが強制終了してしまいます。
対応として、Try~Catchで括ってみましたが、補足できず。
アプリケーションの起動時に
Application.ThreadExceptionとSystem.Threading.Thread.GetDomain().UnhandledException を指定しても
補足できず。
DLLの吐き出している例外が、マネージ例外にマップされていないのか?
とも思ったのですが、それならばUnhandledException で補足できるはずと考えています。
<http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.sehexception(v=vs.80).aspx>
しかしExe実行すると強制終了が動いてしまいますし、
VSのデバッグ実行でも、Try~Cathch内部では補足できなくて、理由がわからない状態です。
※ちなみに、DLLが吐き出している例外をマイコードでthrowするとキャッチできます。
こんなかんじで・・・
DLLの例外
http://www.thinwallets.toypark.in/mm/files/CatchNg.PNG
自分で例外を投げる
http://www.thinwallets.toypark.in/mm/files/CatchOk.PNG
ちなみに例外を吐いているのは、Marshal.Copyメソッドなので
マネージっぽい気もするのですが。。。
アンマネージから発生される例外をキャッチする方法には他に何があるから
ご存知でしたら教えていただけませんか。
よろしくお願い致します。
ちなみにプログラムの処理としては、MapViewOfFileで
CD-RAMのファイル読み込みを行なっています。(フォーマットはFAT32でライブファイルシステム)
その途中で、CDドライブを無理矢理開けたりして、乱暴なことをすると発生します。
◆--------------画像イメージで実行したソースコード(UnhandledExceptionはエントリポイントで実施済)--------------◆
// UnhandledExceptionイベント・ハンドラを登録>>>
System.Threading.Thread.GetDomain().UnhandledException
+=new UnhandledExceptionEventHandler(
( sender, e ) => //( object sender, UnhandledExceptionEventArgs e )
{ System.Windows.Forms.MessageBox.Show( "例外発生!" ); }
);
//データ読込
try
{
cp = MapViewOfFile( hMap, FileMapAccess.FileMapRead, (uint)( u64done >> 32 ), (uint)( u64done & 0xFFFFFFFF ), (uint)i64done );
Marshal.Copy( cp, bufferArray, 0, i64done );
//自力で例外投げたらキャッチできる
//throw new System.Runtime.InteropServices.SEHException();
}
catch( SEHException ){ //発生している例外
throw new Exception();
}
catch { //とりあえず全部
throw new Exception();
}
finally{
}
|
|