gpt4 book ai didi

delphi - 尝试...除了...最后在德尔福有什么意义?

转载 作者:行者123 更新时间:2023-12-03 15:26:41 25 4
gpt4 key购买 nike

我知道这听起来像是一个古老的愚蠢问题,但我在互联网上进行了搜索,但我仍然不明白一件事。我知道 try-finally 将在因错误而停止之前运行finally代码(或者在没有引发异常时不停止),并且try- except将在引发异常时运行 except 代码。但我仍然不明白的是 try-finally 语句中的 try- except 的意义。我写个例子

我总是做这样的事情:

a:=x.Create;
try
a.DoRiskyStuff;
except
ShowMessage('Error!');
end;
a.free;

我多年来从未使用过finally子句,因为我总是处理错误,而且我从来不明白将它们嵌套在一起使用有什么意义。我的解决方案有什么不好的地方?为什么在示例中通常使用这样的内容:

a:=x.Create;
try
try
a.DoRiskyStuff;
except
ShowMessage('Error!');
end;
finally
a.free;
end;

有什么区别?当所有清理工作都可以在 try-except 之后完成时,为什么有人应该使用 finally 子句?

非常感谢您的回答!

编辑:我更改了创建行,所以你们中的一些人想为此攻击我;)

最佳答案

这两个结构之间有两个很大的区别。技术层面和语义层面。

技术

从技术上讲,区别在于finally block 将始终被执行,即使没有异常,而 except block 仅在出现异常时执行.

当您在 try-finally block 中使用 Exit 提前退出函数时,finally block 甚至会被执行。

另外,finally block 确实不会吞掉异常,而 except block 一般会吞掉异常,并且只能逃逸该 block 如果异常类型与您在 on ... do 中指定的异常类型不匹配,或者您手动重新引发它。

语义

except block 旨在处理异常,而finally block 则不然。 finally block 旨在包含无论异常如何都应该执行的代码,即主要是为了保护资源。这就是为什么你应该这样做:

X := TY.Create;
try
// Code that may raise an exception.
finally
X.Free; // Free resource, even if there was an exception.
// Exception is NOT handled.
end;

和:

try
// Code that may raise an exception.
except
// Handle the kind of exceptions you can handle.
end;

请注意,finally 的资源保护不仅限于内存和Free。您可以恢复/撤消/关闭任何应该恢复/撤消/关闭的内容,即关闭打开的文件、关闭打开的连接、关闭已启动的硬件、将鼠标指针恢复到以前的形式等。

所以你也可以将它用于如下代码:

Cursor := crMultiDrag;
try
// Code that may raise exception.
finally
Cursor := crDefault;
end;

关于delphi - 尝试...除了...最后在德尔福有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37906652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com