Перехват исключений в Haskell с помощью gi-gtk и Reactive Banana - PullRequest
0 голосов
/ 23 мая 2018

Мое приложение, конечно, не содержит ошибок, но на всякий случай оно содержит какие-либо нижние значения, которые я хочу добавить в универсальный обработчик исключений, который по крайней мере выведет окно сообщения, чтобы сообщить пользователю о том, какую ошибку сообщать,Поскольку я использую gi-gtk , я полагал, что любые исключения после инициализации будут происходить изнутри функции Gtk.main, поэтому конец моей функции main выглядит примерно так:

let executeProgram =
     catch Gtk.main $ \e -> do
           reportThisBugDialog $ show (e :: SomeException)
           -- Code here to try to recover to a known good state
           executeProgram
executeProgram

Я также использую Reactive Banana на случай, если это уместно, но это за пределами кода FRP.

Однако это не фиксирует никаких исключений.Я поместил error "Test Exception" в обработчик «Help About», и моя программа только что вышла с сообщением, напечатанным на консоли (что, конечно, мои пользователи не увидят).

Как перехватить возникающие исключениявнутри моего кода, когда он реагирует на сигналы GTK?

1 Ответ

0 голосов
/ 28 мая 2018

Здесь есть похожий вопрос (хотя он не специфичен для gi-gtk, поэтому он более общий).Также я бы порекомендовал этот пост.

По сути, исключения из haskell не могут проходить границу haskell / C.Просто потому, что C ничего не знает об исключениях из haskell.

В вашем случае Gtk.main запускает gtk цикл обработки событий, который реализован в C, и обратные вызовы реализуются в haskell.Когда обратный вызов генерирует исключение haskell, он должен пройти цикл событий gtk, чтобы достичь функции executeProgram.Но это невозможно по причине, указанной выше.

Боюсь, решение состоит в том, чтобы перехватить все исключения внутри каждого обратного вызова.В вашем случае вы, вероятно, можете написать обертку над on функцией из gi-gtk, которая перехватит все исключения и покажет диалоговое окно с ошибкой.

...