我正在尝试使用 GNAT 的 SQLite 绑定。我想要一些方法来从这些绑定中获取错误。尝试通读代码,我发现我可以通过提供一个应该处理错误的神秘对象来设置连接......
无论我如何尝试塑造和提供这个对象,库要么不接受它,要么我得到运行时访问检查错误(这个程序的另一个奇怪的方面,因为指针应该始终处于活动状态,因为它永远不会离开声明它的过程...但也许它在 Ada 中的工作方式不同)。
我收到的错误如下所示:
type of aggregate has private ancestor "Error_Reporter"
must use extension aggregate
原来的
Error_Reporter
定义如下:
type Error_Reporter is abstract tagged private;
...
private
type Error_Reporter is abstract tagged null record;
无论如何,下面是有问题的代码的概述:
头文件:
-- type Error_Handler is new Gse.Error_Reporter with private;
type Error_Handler is new Gse.Error_Reporter with record
Message : Asu.Unbounded_String;
end record;
type Error_Handler_Access is access Error_Handler;
procedure On_Error
(Self : in out Error_Handler;
Connection : access Gse.Database_Connection_Record'Class;
Message : String);
-- more stuff ...
-- private
-- type Error_Handler is new Gse.Error_Reporter with record
-- Message : Asu.Unbounded_String;
-- end record;
实施:
...
declare
pragma Suppress (Accessibility_Check);
-- Handler : constant Error_Handler_Access :=
-- new Error_Handler'(Message => Asu.Null_Unbounded_String);
Handler : constant access Error_Handler :=
new Error_Handler'(Message => Asu.Null_Unbounded_String);
-- Handler : aliased Error_Handler;
Descr : Gse.Database_Description :=
Gss.Setup (Db_File, Errors => Handler);
-- Gss.Setup (Db_File, Errors => Handler'Access);
...
注释代码显示了我尝试过的各种事情。 (此外,
pragma
没有任何效果)。
理想情况下,我不想
new
任何事情,除非这是 GNAT 接口的要求。
更好:如果我可以完全避免使用这个对象(应该可以从这个包装器中挽救实际的 Sqlite 连接并访问返回代码和错误消息),但代码不太容易阅读并且正在尝试让用户做我不想要的事情(ORM,多层绑定只会使事情变得复杂),同时隐藏基本的有用功能。我很感激这方面的任何指导。
由于您的 Error_Handler 扩展了 Gse.Error_Handler,因此您的实例化需要指定基类。尝试:
Handler : constant access Error_Handler :=
new Error_Handler'(Gse.Error_Handler with Message => Asu.Null_Unbounded_String);
这提供了基类以及您的子类成员