|
|
1
69
|
|
2
19
你概述的是错误处理问题的通用解决方案——只要仔细使用,我就没问题。 您的特定示例可以简化如下(步骤1):
继续该过程:
|
|
|
3
17
基本思想是,对于可能需要采取的每一项清理行动,都有一个变量,我们可以从该变量的值中判断是否需要进行清理。
我给你看看
现在,如果我们用变量额外跟踪错误状态,我们可以避免
所以,这(仍然)是另一种可以用来解决这个问题的风格。正确使用它可以实现非常干净、一致的代码——就像任何技术一样,如果落入坏人之手,它最终可能会产生冗长而令人困惑的代码:-) |
|
|
4
9
问题在于
FWW,如果你查阅developer.apple.com教程,他们会采用goto方法来处理错误。
|
|
|
5
4
goto的速度非常快,特别是如果你小心地确保它能快速编译。非常适合速度要求很高的应用。对于其他应用程序,为了可维护性,使用if/else+情况来降低开销可能是有意义的。
更新:以下是案例示例
|
|
|
6
3
有时你想在函数中添加一些东西,只需一个goto就可以轻松完成。 |
|
|
7
1
do {
.. set up thing1 that will need cleanup only in case of early exit
if (error) break;
do
{
.. set up thing2 that will need cleanup in case of early exit
if (error) break;
// ***** SEE TEXT REGARDING THIS LINE
} while(0);
.. cleanup thing2;
} while(0);
.. cleanup thing1;
但如果清理只应该在函数失败时发生
在“即使在正常情况下也要清理”的情况下,我会考虑使用
顺便说一句,我有时会使用
REPARSE_PACKET:
switch(packet[0])
{
case PKT_THIS_OPERATION:
if (problem condition)
goto PACKET_ERROR;
... handle THIS_OPERATION
break;
case PKT_THAT_OPERATION:
if (problem condition)
goto PACKET_ERROR;
... handle THAT_OPERATION
break;
...
case PKT_PROCESS_CONDITIONALLY
if (packet_length < 9)
goto PACKET_ERROR;
if (packet_condition involving packet[4])
{
packet_length -= 5;
memmove(packet, packet+5, packet_length);
goto REPARSE_PACKET;
}
else
{
packet[0] = PKT_CONDITION_SKIPPED;
packet[4] = packet_length;
packet_length = 5;
packet_status = READY_TO_SEND;
}
break;
...
default:
{
PACKET_ERROR:
packet_error_count++;
packet_length = 4;
packet[0] = PKT_ERROR;
packet_status = READY_TO_SEND;
break;
}
}
虽然一个可以取代
|
|
8
1
我同意问题中给出的相反顺序的goto清理是大多数函数中最干净的清理方式。但我也想指出,有时候,你无论如何都希望你的功能能够清理干净。在这些情况下,我使用以下变体if if(0){label:}习语来引导清理过程的正确点:
|
|
|
9
1
我个人是 "The Power of Ten - 10 Rules for Writing Safety Critical Code" . 我将在文中附上一小段,说明我认为关于goto的好主意。
并且通常导致代码清晰度的提高。 非循环函数调用图,代码分析器可以利用它,并且可以 其中早期错误返回是更简单的解决方案。) 禁止使用goto 但是: 如果规则看起来 起初很严厉, 从字面上看,你的生活可能取决于它的正确性:用于控制的代码 你乘坐的飞机,离你住的地方几英里远的核电站,或者 将宇航员送入轨道的航天器。 这些规则就像你车里的安全带: |
|
|
10
0
这
如果你正在寻找最佳性能,那么我想
|
|
|
11
0
我认为,就给定的代码而言,这里的问题是错误的。
自己清理 如果他们自己清理,那么foo()就变得非常简单了。
|
|
|
12
0
|
|
|
13
0
然而,旧的讨论。…那么使用“箭头反模式”并稍后将每个嵌套级别封装在静态内联函数中呢?代码看起来很干净,它是最佳的(当启用优化时),并且没有使用goto。简而言之,分而治之。下面是一个例子:
|
|
|
14
0
|
|
|
15
-1
|
|
|
16
-2
我们使用
|
|
|
M.Jane · 组织和编写异常类的正确方法 8 年前 |
|
|
shubham daharwal · java中的内部捕获异常 8 年前 |
|
|
Jon · 如何在不需要任何操作的情况下处理Python异常 8 年前 |
|
|
felix1415 · C++捕获(标准::异常和e)与捕获(…) 8 年前 |
|
k0pernikus · 如何在scala中键入可能引发异常的函数? 8 年前 |