c# - 我应该用 try-catch 语句附上什么类型的代码块?

标签 c# .net exception exception-handling try-catch

<分区>

我已经深入阅读并讨论了以下问题和文章以及许多其他现在和过去的问题和文章:

When to use try/catch blocks?

Main method code entirely inside try/catch: Is it bad practice?

When to use Try Catch blocks

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

What is the Best practice for try catch blocks to create clean code?

Best practices for exception management in Java or C# 在这里:我不喜欢这个说法:( 你不应该试图在每一个可能的地方捕获每一个异常。

Should multiple Try/Catch blocks in a method be combined

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

另一个例子: 我正在使用 EntityFramework 访问数据库,当访问某些东西时可能会联系数据库,我知道如果连接关闭我应该检查连接并尝试打开它,但是有很多很多事情可能会导致这条语句失败,数据库可能是在可移动驱动器上,该驱动器可能在读取时被移除,DBMS 的服务可能因任何原因停止,可能不会抛出空间异常,在我尝试执行我的代码后数据库的方案可能会改变 *** * 原因,我怎样才能防止我的代码失败,我可以只检查所有我能检查的东西,然后继续吗?或者我应该使用 try catch 来处理我可以预期的异常,即使我已经检查过它们?

请给我你的答案的引用,而不是一般的答案!

编辑

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

最佳答案

好问题!您的一个链接 ( Daniel Turini ) 是我的最爱之一。当我的想法需要理顺时,我会一次又一次地回顾它。

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

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

Turini 说“永远不要吞下异常(exception)”。我在想的是对此的扩展:恕我直言,你必须非常小心地让应用程序继续运行,即使是为了响应已知的、明确类型的异常,并且有一个已知的原因:因为即使这样也构成了“吞噬”异常.去做,但要小心并做好。

所以在我看来,总有一个通用的“任何其他情况”异常处理程序的空间,它通过记录发生的事情的细节并关闭应用程序。

我的 2c..

关于c# - 我应该用 try-catch 语句附上什么类型的代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13439941/

相关文章:

c# - 如何将制表符分隔的文件读入列表数组?

c# - 为什么当我按下按钮时我的列表会重置?

c# - asp.net文字控件bgcolor

c# - ClickOnce 应用程序在验证应用程序需求时退出

c# - Reactive 框架是否可用于 .NET Framework 3.5?

mysql - 在MySQL存储过程中记录异常信息

c# - TaskCompletionSource 无法处理多个等待的任务 - 我做错了什么?

c# - 两个日期之间的天数、小时数、分钟数、秒数

java - 方法中没有 throws 声明的情况下抛出检查异常

c++ - Bad_alloc 问题