4

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));
};

しかし、このイベントは決して発生しません。

4

1 に答える 1

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 では、コードを実行する方法が 2 つあります。

コマンドで

コードの重複を避けるには、次のようにインターフェイスを宣言します。

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 で直接ラップするだけです。

于 2012-09-12T19:04:30.843 に答える