Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异常处理_C#_.net - Fatal编程技术网

C# 异常处理

C# 异常处理,c#,.net,C#,.net,在我们的应用程序中,我们使用其他团队开发的组件。问题是如何定义一种比这更好的异常处理方法 try { someComponent.DoStuff(); } catch (Exception ex) { textLabel= ex.Message; } 组件没有自定义的异常类型,定义一个特定于组件的异常类型并以某种方式包装它可能是一种很好的方法? 我知道这个问题很基本,但我更感兴趣的是,让我们来谈谈如何做好这件事。如果调用另一个没有自定义异常

在我们的应用程序中,我们使用其他团队开发的组件。问题是如何定义一种比这更好的异常处理方法

   try
   {
    someComponent.DoStuff();
   }

   catch (Exception ex)
   {
    textLabel= ex.Message;
   }
组件没有自定义的异常类型,定义一个特定于组件的异常类型并以某种方式包装它可能是一种很好的方法?
我知道这个问题很基本,但我更感兴趣的是,让我们来谈谈如何做好这件事。如果调用另一个没有自定义异常类型的组件,如何以优雅的方式处理任何潜在的异常?

假设要捕获每种类型的异常,这个解决方案在我看来很好。

理想情况下,您应该让组件开发团队为您做这件事-他们还希望他们的客户如何识别和处理组件中的错误?确定组件可能引发的异常的范围是好的C设计的基本部分


如果这不是一个选项,那么在组件的顶部实现您自己的包装器来对其故障案例进行分类听起来是一个不错的第二选择,而且您非常愿意参与交易。

如果第三方库的文档记录很差,他们不会指定每个方法可以引发的异常,有一些工具可以反映到代码中,并确定可能引发的异常。这可能会让人有点望而生畏——任何给定调用都会抛出数量惊人的异常,但原则上这比捕获一般异常类型要好。下面是执行此类分析的示例。

根据您对使用该组件的了解,或者通过使用类似的方法来分析已编译的组件,该组件可能引发哪些异常?为这些异常提供异常处理程序可以让您向用户提供更好的反馈吗?

当您发现一个错误时,您可以重新打包它,然后抛出另一个错误,在最基本的级别上,您可能只是添加了更多的数据-但是,根据您的建议,您还可以用自定义错误替换一般错误,虽然它不能克服您从组件得到的响应的局限性,但它会给调用堆栈更高层次的代码提供更恰当响应的机会

因此,就以最基本的方式添加信息而言——在传递原始异常的同时,抛出一个新异常和一些附加文本:

catch (Exception ex)
{
    throw new Exception("This is more about where the exception occurred", ex);
}
现在,如果您想定义自己的自定义组件异常,您可以将新异常更改为new ComponentSpecificException,在构造函数中添加必要的数据,但不要忘记设置内部异常。异常还有一个键、值对的数据集合,您可以通过创建异常、添加数据然后执行抛出来插入更多信息

这些都是相当普遍的-从那里开始工作,如果您不一定能够预测必须处理的所有异常,您不必尝试-您可以设置日志记录,以便知道何时出现了一般异常,即到达最终捕获的异常-然后随着时间的推移,在一般异常之上添加特定于异常的捕获,以提供更合适的响应,或者至少,将错误打包为不太常见的自定义异常


我不确定我是否已经很好地解释了这一点,但其概念是,由于很难预测每一个可能的错误,因此在发现新的异常时,您希望有一个策略以系统的方式开发您的应用程序。

处理异常的唯一合理且不那么优雅的方法是,如果无法从中恢复,则记录它们

然后通知用户出现问题,如果是交互式程序,则让他们有机会重试


如果您的应用程序是专为.NET开发人员开发的,那么继续向他们显示异常消息会更好,因为它包含堆栈跟踪。否则,不要在用户界面中显示异常消息-这是一个安全漏洞,只会混淆用户。

组件是否将所有异常重新打包到系统中。异常?如果不是的话,你可以用正常的接球来处理。如果是的话。。。祝你好运,别这样。您不知道异常有多严重。需要注意的一点是:如果您使用的是ComponentSpecificException,则必须正确设置捕获异常的原因,通过对ComponentSpecificException调用initCause并抛出它返回的内容,或者通过将捕获的异常传递给异常或RuntimeException构造函数。否则,正如@Jeff所指出的,您将丢失堆栈跟踪信息。看到关于你们两个注意事项的类注释了吗?从未忘记设置内部异常?只是好奇-:哦,对不起,墨菲。昨天我的阅读理解能力处于历史最低水平。