7

我开发了一个使用外部 dll 作为 FTPServer 的项目,我在我的项目上创建了 FTP 服务器,如下所示:

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

上面的代码创建了一个 FTP 服务器类的实例,该类在其构造函数上启动 FTPserver,当客户端正确发送请求时,它作为一个模块独立工作,但是当错误的请求到达 FTP 服务器时,它会引发异常并导致我的应用程序崩溃。

如何处理外部 dll 引发的异常以防止我的应用程序崩溃?

4

4 回答 4

6

我最近回答了一个类似的(ish)问题,这可能很有用 - 捕获完全意外的错误

编辑。我必须同意 Hans 上面的评论 - 可能是寻找另一个 FTP 服务器的想法。

为了完整起见,这里是来自 - http://msdn.microsoft.com/en-GB/library/system.windows.forms.application.threadexception.aspx的 appdomain/thread 异常设置

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 代码内部发生的内存访问冲突异常。为了捕获这些异常,需要做三件事。我做了他们,它对我有用:

  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 下运行时,如果您转到“调试”菜单并选择“异常...”,如果您在调试器下启动程序,它将允许调试器中断所有异常,而不仅仅是未处理的异常. 只需单击“Common Language Runtime Exceptions”旁边的“Thrown”复选框。

于 2013-02-20T10:24:32.357 回答