【问题标题】:How to manage exceptions when using gtkada使用 gtkada 时如何管理异常
【发布时间】:2012-09-11 09:03:07
【问题描述】:

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

此应用程序已请求运行时以异常方式终止它。

请联系应用程序的支持团队了解更多信息。

测试代码如下:

    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;

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

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

谢谢

【问题讨论】:

  • 猜你是在windows上,尝试在没有'-mwindows'开关的情况下构建同一个项目(或从控制台运行gui_test_4.exe > log.txt),如果你的问题消失了就发布:)
  • 其实我并没有使用switch,它也不起作用。它仍然崩溃。感谢您的评论。
  • 嗯,奇怪(我以为你试图以某种方式访问​​不存在的控制台,因此崩溃了);尽管如此,我可以编译和运行gui_test_4,而不会出现任何故障(在 Windows/Linux 上)。仅供参考,在 Windows 上我按如下方式构建它:gnatmake -g -E gui_test_4.adb -Ic:\bin\gtkada\include\gtkada -largs -LC:/bin/gtkada/lib/gtkada -lgtkada -LC:/bin/gtkada/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -lglib-2.0 -lgobject-2.0 -lgdk_pixbuf-2.0 -lpango-1.0
  • GNAT/GtkAda 版本分别为 2012-i686-pc-mingw322.24.2-nt,均来自 AdaCore。
  • 它在另一台电脑上工作,看来问题出在我的身上。谢谢。

标签: exception gtk ada gnat


【解决方案1】:

在我看来,调试器是一项工作。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多