如何捕获AutoCAD.NET中抛出的未处理异常

时间:2012-09-12 08:51:46

标签: c# autocad autocad-plugin

在我的Autocad.NET应用程序中,我想使用log4net记录所有未处理的异常。 AutoCAD本身会显示一个带有详细消息的错误对话框 - >所以必须有办法注册某个事件。

我尝试在应用初始化时注册AppDomain.CurrentDomain.UnhandledException事件:

AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
     System.Exception exception = (System.Exception)e.ExceptionObject;
     log.Error(String.Format("Unhandled Exception: {0}\n{1}", exception.Message, exception.StackTrace));
};

但这件事永远不会被解雇。

1 个答案:

答案 0 :(得分:4)

在ObjectARX中,有一个名为acedDisableDefaultARXExceptionHandler的函数。您可以尝试P / Invoke它。

    // EntryPoint may vary across autocad versions
    [DllImport("acad.exe", EntryPoint = "?acedDisableDefaultARXExceptionHandler@@YAXH@Z")]
    public static extern void acedDisableDefaultARXExceptionHandler(int value);

您也可以尝试System.Windows.Forms.Application.ThreadException:http://through-the-interface.typepad.com/through_the_interface/2008/08/catching-except.html

最简单的方法是将所有代码包装在try / catch块中。在AutoCAD中,有两种执行代码的方法:

使用命令

为避免重复代码,请声明如下界面:

public interface ICommand
{
  void Execute();
}

然后将它用于您的命令:

public class MyCommand : ICommand
{
  void Execute()
  {
    // Do your stuff here
  }
}

在定义命令的类中,使用此泛型方法执行:

void ExecuteCommand<T>() where T : ICommand
{
  try
  {
    var cmd = Activator.CreateInstance<T>();
    cmd.Execute();
  }
  catch (Exception ex)
  {
    Log(ex);
  }
}

现在您的命令如下所示:

[CommandMethod("MYCMD", CommandFlags.Modal)]
public void MyCommand()
{
  ExecuteCommand<MyCommand>();
}

在事件处理程序中

在这种情况下,当您需要事件参数时,只需将代码直接包装在try / catch中。