我使用的库似乎没有记录异常。该库用于与公司生产的产品进行通信。我希望能够区分抛出的异常,但我不知道异常的名称(例如,在通信超时或欠压条件之间)。
他们的所有示例仅使用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
答案 0 :(得分:11)
此:
System.Exception: Timeout
表明他们只是抛出一个System.Exception
,例如
if (weHaveNoApiDesignSkills)
{
throw new Exception("Timeout");
}
有可能有一些例外更好的设计,但你所展示的那个例子并不乐观:(
不幸的是,除非你开始使用异常中的消息来区分它们(这几乎总是总是一个坏主意),否则你会被卡住。可能值得向图书馆的作者询问他们是否可以改进未来版本的问题。
答案 1 :(得分:4)
使用诸如catch(Exception ex)
之类的全能结构捕获它,然后检查Type
返回的ex.GetType()
。如果它等于typeof(Exception)
,则意味着他们没有抛出比Exception
更具体的内容。
答案 2 :(得分:0)
顺便说一句,如果在捕获异常时(例如,在catch块中)停止了,如果在监视窗口中输入$exception
,您将看到整个异常。
答案 3 :(得分:0)
当您正在使用的库中的API没有正确记录时,您应该捕获基本异常并通过将异常转换为字符串而不仅通过消息而不是整个异常进行记录。例如
try
{
//api call which throws exception.
}
catch(Exception ex)
{
//log ex.ToString();
}
答案 4 :(得分:-1)
使用反编译器,例如:
<。>在.net中没有像java这样的显式异常声明,所以我认为这是唯一的方法。