7

FTPServerとして外部dllを使用するプロジェクトを開発しました。プロジェクトに次のようにFTPサーバーを作成しました。

private ClsFTPServer _ClsFTPServer;
_ClsFTPServer = new ClsFTPServer(FTPUserName, FTPPassword, FTPPath);

上記のコードはFTPサーバークラスのインスタンスを作成し、クラスはそのコンストラクターでFTPサーバーを起動し、クライアントがリクエストを正しく送信している間、モジュールとして独立して正常に動作しますが、FTPサーバーに誤ったリクエストが来ると、例外をスローして原因となりますアプリケーションがクラッシュします。

アプリケーションがクラッシュするのを防ぐために、外部dllによってスローされた例外をどのように処理できますか?

4

4 に答える 4

6

私は最近、役に立つかもしれない同様の(っぽい)質問に答えました- 完全に予期しないエラーをキャッチします

編集。上記のハンスのコメントに同意する必要があります-別のFTPサーバーを見つけるためのアイデアかもしれません。

完全を期すために、次のappdomain/thread例外の設定を示します-http: //msdn.microsoft.com/en-GB/library/system.windows.forms.application.threadexception.aspx

Application.ThreadException += new ThreadExceptionEventHandler  (ErrorHandlerForm.Form1_UIThreadException);

// Set the unhandled exception mode to force all Windows Forms errors to go through 
// our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException +=
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
于 2013-02-20T10:32:28.080 に答える
1

あなたはおそらくすでにこれを試しましたが、念のために、それを?で包んでみましたtry catchか?

try
{
    _ClsFTPServer = new ClsFTPServer(FTPUserName, FTPPassword, FTPPath);
    ...
}
catch(Exception e)
{
    ...
}
于 2013-02-20T10:06:01.547 に答える
1

外部のアンマネージド\アンセーフコードを使用する場合、.NET(.net 4より上)はデフォルトで、dllコード内で発生するメモリアクセス違反の例外を処理できません。この種の例外をキャッチするには、3つのことを行う必要があります。私はそれらをしました、そしてそれは私のために働きました:

  1. 内部で例外が発生したメソッドにこれらの属性を追加します:(
    アンマネージコードのメソッドを呼び出すメソッド)。

    [HandleProcessCorruptedStateExceptions]
    [SecurityCritical]
    
  2. このタグをランタイムタグの下のApp.Configファイルに追加します。

    <runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true"/>
    <!-- other tags -->
    </runtime>
    
  3. System.AccessViolationException例外タイプを使用して、これらの種類の例外をキャッチします。

      try{
            //Method call that cause Memory Access violation Exeption
         }
    catch (System.AccessViolationException exception)
         {
            //Handle the exception here
          }
    

私が言ったことは、これらのタイプの例外の治療法にすぎません。この例外のエゴとこのアプローチの仕組みの詳細については、System.AccessViolationExceptionを参照してください。

于 2020-03-17T12:41:54.717 に答える
-3

オブジェクトとそのメソッドへのすべての呼び出しの周りにtry...catchブロックを配置することによって。

何かのようなもの:

try
{
    // use the DLL in some way
}
catch (Exception e) 
{
    // Handle the exception, maybe display a warning, log an event, etc.)
}

また、Visual Studioで実行しているときに、[デバッグ]メニューに移動して[例外...]を選択すると、未処理の例外だけでなく、デバッガーでプログラムを起動した場合に、デバッガーがすべての例外を中断できるようになることにも注意してください。 。「共通言語ランタイム例外」の横にある「スロー」チェックボックスをクリックするだけです。

于 2013-02-20T10:24:32.357 に答える