1

我正在使用一个似乎没有记录异常的库。该库用于与公司生产的产品进行通信。我希望能够区分引发的异常,但我不知道异常的名称(例如通信超时或欠压条件之间)。

他们所有的例子都只使用catch(Exception ex). 我怎样才能找到我需要用来捕捉个别错误的东西?当我这样做时,ex.toString()我会得到这样的东西:

System.Exception: Timeout
    at CMLCOMLib.EcatObj.Initialize()
    at copley_cmo_test.MainWindow.btnConnect_Click(Object sender, RoutedEventArgs e)
in c:\Users\adam.siembida\Desktop\copley_cmo_test\copley_cmo_test\MainWindow.xaml.cs:line 41
4

5 回答 5

10

这个:

System.Exception: Timeout

表明他们只是在扔一个裸露的东西System.Exception,例如

if (weHaveNoApiDesignSkills)
{
    throw new Exception("Timeout");
}

可能有一些设计得更好的例外情况,但您展示的例外情况并不乐观:(

不幸的是,除非您开始使用异常中的消息来区分它们(这几乎总是一个坏主意),否则您会被卡住。可能值得询问图书馆的作者,看看他们是否可以改进未来版本的问题。

于 2013-06-20T17:17:09.000 回答
3

用一个包罗万象的结构来捕捉它,例如catch(Exception ex),然后检查Type返回的 by ex.GetType()。如果它等于typeof(Exception),则意味着他们没有抛出任何比 更具体的东西Exception

于 2013-06-20T17:18:21.663 回答
0

当您正在使用的库中的 API 没有正确记录时,您应该捕获基本异常并不仅通过消息记录它,而且通过将异常转换为字符串来记录整个异常。例如。

   try
   {
       //api call which throws exception.
   }
   catch(Exception ex)
   {
       //log ex.ToString();       
   }
于 2013-06-20T17:31:32.113 回答
0

顺便说一句,如果您在异常被捕获时停止(即在一个catch 块中),如果您进入$exception监视窗口,您将看到整个异常。

于 2013-06-20T17:20:53.367 回答
-1

例如使用反编译器:

http://www.jetbrains.com/decompiler/

在 .net 中没有像 java 中那样的显式异常声明,所以我认为这是唯一的方法。

于 2013-06-20T17:18:08.947 回答