如何在使用gtkada时管理异常

时间:2012-09-11 09:03:08

标签: exception gtk ada gnat

当我使用gtkada并且我的GUI正在运行时,没有管理异常并且程序总是崩溃。消息是

此应用程序已请求Runtime以不寻常的方式终止它。

请联系应用程序的支持团队以获取更多信息。

测试代码如下:

    with GLib;          use GLib;
    with Gtk.Label;     use Gtk.Label;
    with Gtk.Window;    use Gtk.Window;
    with Gtk.Frame;     use Gtk.Frame;
    with Gtk.Button;    use Gtk.Button;
    with Gtk.Widget;    use Gtk.Widget;

    with Gtk.Handlers;
    with Gtk.Main;


    procedure gui_test_4 is
       Window          : Gtk_Window;
       Label           : Gtk_Label;
       Frame           : Gtk_Frame;
       Button_S        : Gtk_Button;
       General_Error   : exception;

       package Handlers is new Gtk.Handlers.Callback (Gtk_Widget_Record);
       package Return_Handlers is
          new Gtk.Handlers.Return_Callback (Gtk_Widget_Record, Boolean);

       function Delete_Event (Widget : access Gtk_Widget_Record'Class)
          return Boolean is
       begin
          return False;
       end Delete_Event;

       procedure Destroy (Widget : access Gtk_Widget_Record'Class) is
       begin
          Gtk.Main.Main_Quit;
       end Destroy;

       procedure Clicked (Widget : access Gtk_Widget_Record'Class) is
       begin

          raise General_Error;
        exception
            when General_Error =>
              null;

       end Clicked;


    begin
       Gtk.Main.Init;
       Gtk.Window.Gtk_New (Window);
       Set_Default_Size (Window, 200, 200);
       Gtk.Window.Set_Title (Window, "GUI_Test_4");
       Gtk_New (Frame);
       Add (Window, Frame);
       Gtk_New (Button_S, "Try");
       Add (Frame, Button_S);

       Return_Handlers.Connect
       (  Window,
          "delete_event",
          Return_Handlers.To_Marshaller (Delete_Event'Access)
       );
       Handlers.Connect
       (  Window,
          "destroy",
          Handlers.To_Marshaller (Destroy'Access)
       );
       Handlers.Connect
       (  Button_S,
          "clicked",
          Handlers.To_Marshaller (Clicked'Access)
       );

       Show_All (Window);
       Show (Window);

       Gtk.Main.Main;

    end gui_test_4;

当按下按钮时,会引发异常,但应该以相同的过程进行管理,但不是这样,完整的程序会崩溃。

知道如何解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:2)

看起来像是调试器的工作。

在评论中提到其他人能够成功运行和构建相同的代码。这可能意味着您的GTKAda版本存在问题。它可能意味着存在一个真正的错误,但它是如何/如果表达取决于在程序启动时哪些垃圾值被加载到哪些内存区域。

您可以从确保拥有最新版本的GTKAda开始。但在那之后,启动调试器并尝试查看其崩溃的位置。请注意,在Ada程序中,在主要代码中的第一行代码被调用之前,在程序包详细说明期间经常会发生崩溃。如果您正在使用Gnat,您也可以逐步完成GDB中的精化过程。对于其他编译器,您可能必须找到一些细化代码来尝试将断点放入其中以便及早捕获它。