2011-06-25 52 views
0

我使用的是我從互聯網上獲取的利用C#中的網絡攝像機的dll。如果找不到網絡攝像頭連接,我想顯示「無法找到要使用的攝像頭,請確認此時沒有其他應用正在使用您的攝像頭,然後重試」。我遇到的問題是dll的創建者在他們的dll編程中包含了一個try-catch ......所以我的try-catch永遠不會看到這個異常,因爲一個「引用未設置爲對象實例的對象」錯誤出現了(通過try/catch格式化成MessageBox)。有沒有一種方法可以在顯示消息並顯示自己的內容之前覆蓋內置的錯誤處理?C#覆蓋try-catch在另一個功能

+0

找出他們如何先測試WebCam,然後調用他們的方法......除非您想弄清楚如何自動化調試器。 ;-) –

+4

比利,你從哪裏得到這個DLL?媽媽,我從互聯網上得到它! –

回答

2

如果你得到「對象沒有被設置爲對象的實例」(NullReferenceException),那麼很可能它們實際上沒有發現異常。

如果你想捕捉那個確切的案例(並讓其他錯誤,你不知道和不能處理掉 - 通過適當的方式來做異常處理),你可以嘗試讓堆棧變髒包含異常信息:

class Program 
{ 
    public static void DoSomething() 
    { 
     string blah = null; 
     Console.WriteLine(blah.Length); 
    } 

    static void Main(string[] args) 
    { 
     try 
     { 
      DoSomething(); 
     } 
     catch (NullReferenceException e) 
     { 
      string methodName = e.TargetSite.Name; 
      Console.WriteLine(methodName); 

      System.Diagnostics.StackTrace trace = 
       new System.Diagnostics.StackTrace(e, true); 

      int lineNumber = trace.GetFrame(0).GetFileLineNumber(); 
      Console.WriteLine(lineNumber); 

      if(methodName == "DoSomething" && lineNumber == 13) 
      { 
       ShowErrorToUser(); // Todo: Implement this 
      } 
      else 
      { 
       throw; // Just re-throw the error if you don't know where it came from 
      } 
     } 
    } 
} 

編輯

在評論它真的被抓,並在消息框中顯示的發現了。

我會留下這個答案,因爲它適用於類似的情況,但不適用於這種情況。請參閱OscarMK的回答。

+0

我試着捕獲一個NullReferenceException,但我仍然得到同樣的結果。我不確定我之前是否清楚或不知道它,但是它出現在一個消息框中,所以我知道他使用catch來顯示他的代碼中發生的任何錯誤。我需要以某種方式覆蓋它,並不知道如何通過我的try/catch能夠處理它,他已經有了。這不是生與死,但我想要一個更好的錯誤信息,有人可能實際上能夠理解。 – Brandon

+0

@Brandon:不,不清楚:)你可以編輯你的問題,使「對象引用...出現」,說一些關於在消息框中顯示的錯誤?另外,如果代碼授權沒有問題,您可以嘗試使用ILSpy之類的代碼將代碼從DLL中取出。 –

+0

這樣做,我不知道那個程序,我將不得不檢查出來。這是一個「開源」項目,因爲它在不同的開源網站上發佈,除非他沒有發佈他的代碼。他只是發佈了他的C#項目文件源代碼。 – Brandon

1

你不能只重寫try-catch塊,但是你可以重寫該方法,基本上完成前面的方法所做的一切並刪除try-catch塊。

+0

我很想去,但我不知道如何處理相機,這就是爲什麼我出去尋找解決方案。我嘗試過使用WIA,但它似乎涉及很多問題,我發現的dll只是做了我所需要的。 (我希望這聽起來不像是因爲它本意不是這樣) – Brandon

+0

我建議使用像ILSpy這樣的反彙編工具來查看它們的代碼是如何工作的,這樣你就可以編寫出更好的版本了。 – dahlbyk