2012-09-12 91 views
4

在我的Autocad.NET應用程序中,我想使用log4net記錄所有未處理的異常。 AutoCAD本身顯示一個包含詳細信息的錯誤對話框 - >所以必須有一種方法來註冊某個事件。如何捕獲AutoCAD.NET中引發的未處理的異常

我試圖註冊在應用程序初始化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)); 
}; 

但此事件從來沒有發射。

+0

也許這個異常是由對話框處理的。 –

+1

如果AutoCAD不會崩潰 - 也就是說,例外已經由AutoCAD處理了 – opewix

+0

在AutoCAD異常處理之前有辦法處理它嗎? – mamuesstack

回答

4

在ObjectARX中,有一個函數叫做acedDisableDefaultARXExceptionHandler。你可以嘗試P /調用它。

// EntryPoint may vary across autocad versions 
    [DllImport("acad.exe", EntryPoint = "[email protected]@[email protected]")] 
    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 /直接抓住。

+0

您可以將descripes與我發現的最佳方法鏈接起來。謝謝 – mamuesstack

+0

調用acedDisableDefaultARXExceptionHandler禁用不會爲我更改任何內容 – diimdeep

相關問題