C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

UnhandledExceptionでも補足できない例外?


(過去ログ 107 を表示中)

[トピック内 1 記事 (1 - 1 表示)]  << 0 >>

■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{
    
  }

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -