gpt4 book ai didi

multithreading - Delphi异常处理,使用E : Exception or ExceptObject

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

我们有2个应用程序,第一个是VCL项目,另一个是Windows服务。

在 VCL 项目中我们做:

try
except
on E: Exception do
// do something with E.Message
end

但是在 Windows 服务(使用多个线程)中我们使用:

try
except
// do something with Exception(ExceptObject).Message
end

我从同事那里得到的信息是“我们必须在线程中使用 exceptObject,在使用 GUI 的应用程序中使用 E: Exception”。但我找不到任何与此相关的信息。

我在这里找到了一个例子http://edn.embarcadero.com/article/10452其中使用实例变量来存储异常并使用 exceptObject,但没有解释原因。

这个 exceptObject 是线程安全的吗(因为它来自“系统”单元)?

那么在 Delphi 中处理异常的正确方法是什么?为什么有不止一种方法可以做到这一点?

最佳答案

没有正确的方法来处理异常。只有一种方法。可能会让您感到困惑的是处理创建的异常对象,该对象导致引发异常,但其生命周期对您来说最重要。

一般来说,处理这些异常对象只有两种方法。要么让它们在异常 block 范围之外存活并自行释放它们,要么在异常 block 结束时通过 RTL 释放它们。

但要回答我猜你问的问题。 Exception类不是线程安全的。而且,您的同事错了,因为没有人被迫在线程中使用特定的异常处理。无论如何,这些规则对于进程创建的所有线程都是相同的。只是,这些异常对象在异常 block 内可能不稳定:

1。从ExceptObject中获取当前异常对象

ExceptObject返回当前异常对象。实际上,可能会导致这种情况;如果将此类对象引用存储到异常处理程序 block 内的变量中,并且该 block 中将引发另一个异常,则该存储的实例可能会变得无效。这是相当不安全的。

但这并不意味着您无法获取此类对象的引用并通过使用某些同步机制(因为它不是线程安全类)将其传递给另一个线程并在那里使用它。您只需要注意不会引发其他异常,因为这会使之前存储的对象无效,因此您必须从调用者的角度考虑 留在异常处理程序中,并且必须使用一种线程同步机制。

因此,实际使用从 on 表达式获取的异常对象可能比使用 ExceptObject 更稳定 。但同样的规则也适用于此;您需要将 on 表达式中的对象实例与另一个线程同步(因为它不是线程安全类),但在这种情况下,从 on 获取的对象表达式不会像 ExceptObject 那样改变一个可以在某个异常 block 内。

2。使用AcquireExceptionObject保留异常对象

AcquireExceptionObject函数允许您使异常对象保持事件状态,即使在异常 block 之外也是如此。

对于线程同步时的异常处理,我建议您使用 AcquireExceptionObject即使在异常 block 结束后,该函数也可以使异常对象自由使用。对于带来唯一责任的您,请通过调用 ReleaseExceptionObject 释放此类获取的对象。过程或再次通过该对象引发异常。

关于multithreading - Delphi异常处理,使用E : Exception or ExceptObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48874276/

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