![]() |
1
5
这要看情况而定。
在巨蟒中,你可以通过捕捉
|
![]() |
2
5
不能保证不抛出异常。考虑一下字典上的这个小例子…
在我看来,合同的意思是“如果你试图做的事情失败了,我不会抛出一个异常”,但这与“我不会抛出任何异常”相差甚远。因为你可能没有写一个框架,你可以用这样的东西来妥协……
…并且不要用那个catch块处理tryxx失败案例(所以您没有一堆普通的日志实体)。在这种情况下,您至少要揭示bug的性质,并在开发期间识别它,并在运行时注意它。 |
![]() |
3
3
|
![]() |
4
2
Uri.TryCreate 抛出一个UriFormatException,例如,正如该方法的msdn文档明确指出的那样,它绝对是合同中的一个中断:
另一个是TrydeQueue,我找不到任何文档,但它似乎也是一个bug。如果调用了方法 通常,这种方法有两个版本,一个抛出异常,另一个不抛出异常。例如, Int32.Parse Int32.TryParse . 重点 Tryxxx 隐藏 例外情况。它适用于失败实际上不是特殊情况的情况。例如,如果您正在从控制台中读取一个数字,并且希望一直尝试直到输入正确的数字,那么您不希望一直捕获异常。同样,如果您想从字典中获取一个值,但这是一个完全正常的情况,它可能不存在,那么您可以使用 TryGetValue 不应引发异常,也不应设计为隐藏异常。它适用于失败是正常的和非异常的情况,并且您希望能够轻松地检测到该情况,而无需花费额外的开销和努力捕获异常。通常也会提供一个非Tryxx方法,它确实提供异常,用于异常情况。 |
![]() |
5
1
|
![]() |
6
1
例如,如果方法从数据读取器中读取字符串值并尝试将其解析为整数,则在解析失败时不应引发异常,但如果数据读取器无法从数据库中读取或正在读取的值根本不是字符串,则应引发异常。 该方法应该遵循捕获异常的一般原则,即只捕获您知道如何处理的异常。如果发生了完全不同的异常,您应该让它冒泡到其他知道如何处理它的代码中。 |
![]() |
7
1
这不是完全正确的-有一些例外
可以
|
![]() |
8
1
Tryxx应该只保证它不会抛出它知道如何处理的异常。如果它不知道如何处理给定的异常,为什么要捕获它?你也一样-如果你不知道该怎么做,为什么你会抓住它?badalloceexceptions例如,好吧,(通常)除了在您的主try/catch块中捕获它们之外,对它们没有太大的作用。显示一些错误消息并尝试优雅地关闭应用程序。 |
![]() |
9
1
像在您的示例中那样捕获和吞咽所有异常通常是一个坏主意。一些例外,尤其是
菲尔·哈克有一个 blog entry |
![]() |
10
1
不,我不会在我的TryFoo方法中接受异常。foo依赖于tryfoo,而不是相反。由于您提到了通用字典,它有一个getValue和一个TryGetValue方法,我将编写如下字典方法:
因此,getValue依赖于TryGetValue,如果TryGetValue返回false,则抛出异常。这比从TryGetValue调用GetValue并吞咽产生的异常要好得多。 |
![]() |
11
1
因为这颠覆了
就抛出异常而言,答案是,是的,有时
|
![]() |
12
0
我曾经参加过一次很棒的演讲,有人说他参与了为BCL制定异常处理策略。不幸的是,我忘了他的名字,找不到我的笔记。
这里有趣的一点是4。我清楚地记得他说过 单一故障模式 指南的一部分。其他失败仍应引发异常。 顺便说一下,他还说,clr团队告诉他.NET异常速度慢的原因是它们是在SEH之上实现的。他们还说,没有特殊的需要以这种方式实施(除了权宜之计),如果他们曾经进入真正客户的真正性能问题前10名,他们会考虑重新实施他们更快! |
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
![]() |
zaen · 将值传递到异常字符串消息中 2 年前 |
![]() |
Zephyr · 如何在双ListView选择系统上实现过滤器? 6 年前 |
![]() |
Aave · 错误数组长度的特定异常 6 年前 |