我应该用try-catch语句包含哪些类型的代码块?

Saw*_*wan 6 .net c# exception-handling exception try-catch

我现在和过去已经深入阅读和讨论了以下问题和文章:

何时使用try/catch块?

主要方法代码完全在try/catch中:这是不好的做法?

何时使用Try Catch块

我将使本文成为组织中异常处理的编码标准!非常好但没有回答我:http: //www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

try catch块创建干净代码的最佳实践是什么?

Java或C#中的异常管理的最佳实践在 这里:我不喜欢这个声明:(你不应该试图捕捉每个可能的地方的每一个例外.

应该组合方法中的多个Try/Catch块

我有一个问题,当我需要决定用try-catch语句包含一些代码块时,我知道应该包含代码是错误的代码,我必须检查我可以检查的内容,但是例如:我需要在一些文本文件中写一行,我应该检查文件是否存在,如果我有权写入它,我应该检查磁盘上是否有空间,或者磁盘是否可写,如果我检查了如果我在编写文件时发生了什么事情(其他一些应用程序或线程使用了空间,或者可移动驱动器已被删除?),如果我检查了这些内容并处理了IOException和SecurityException以及其他可能的异常,这是最佳实践吗? ,或者我应该只检查没有try-catch?

另一个例子:我正在使用EntityFramework来访问数据库,当访问某些内容时可能会联系数据库,我知道我应该检查连接是否关闭并尝试打开它,但是有很多很多东西可能会导致这个语句失败,数据库可能位于可移动驱动器上,此驱动器可能在读取时被删除,DBMS的服务可能因任何原因停止,不会抛出空间异常,数据库的方案可能会在我尝试执行某些代码后发生变化****原因,我如何防止我的代码失败,我可以检查我可以检查的每件事,然后继续吗?或者我应该使用try catch作为例外我可以期待,即使我已经检查了它们?

请给我你的答案参考,而不是一般的答案!

编辑

请务必阅读:http: //msdn.microsoft.com/en-us/library/seyhszts.aspx

seb*_*ebt 4

好问题!你的链接之一(丹尼尔·图里尼)是我最喜欢的链接之一。当我的思维需要理顺时,我会一次又一次地回顾它。

表达我对异常处理态度的一个好方法是:只处理你能处理的异常。这意味着您永远无法弄清楚如何响应任何可能出现的异常,并在代码中实现它。有一些可以处理的“预期”异常 - 但代码响应这些异常的行为本身就是一个设计决策。恕我直言,处理这些问题的首要任务是在应用程序关闭后不要留下一团糟(或者至少退出它所涉及的特定事务)-应用程序无论如何都不能继续运行,因为关闭带有优雅的“我不知道为什么,但是发生了这个异常”通知(发送到日志/IT电子邮件/MsgBox,等等)在某种程度上是一件“坏事”。

与这种设计直接相反的是异常处理,它试图使应用程序成为一种“核末日幸存者”。 尝试...我已经看到代码通过假设网络文件服务器已关闭来响应 IO 错误,并分支到尝试以某种未设计的方式在 C: 驱动器上工作。以及尝试从 ATable 中进行 SELECT 的代码:如果该表不存在,则会创建它!每当有人写出这样的代码时,就会有一只负鼠宝宝死去。

图里尼说“永远不要吞下例外”。我在想的是这个的延伸:恕我直言,你必须非常小心地让应用程序继续运行,即使是响应已知的、明确类型的异常,且原因已知:因为即使这也构成了“吞噬”异常。去做,但要小心、做得好。

因此,在我看来,总有一个通用的“任何其他情况”异常处理程序的空间,通过记录发生的事情的详细信息并关闭应用程序,将决定委托给更高的权力(人)。

我的2c..