1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# PyRoom - A clone of WriteRoom
# Copyright (c) 2007 Nicolas P. Rougier & NoWhereMan
# Copyright (c) 2008 The Pyroom Team - See AUTHORS file for more information
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------------
"""
Errors raised within pyroom
"""
import gtk, pango
import traceback
from exceptions import KeyboardInterrupt
class PyroomError(Exception):
"""our nice little exception"""
pass
def handle_error(exception_type, exception_value, exception_traceback):
"""display errors to the end user using dialog boxes"""
if exception_type == PyroomError:
message = exception_value.message
elif exception_type == KeyboardInterrupt: # ctrl+c
return
else: # uncaught exception in code
message = _("""There has been an uncaught exception in pyroom.\n
This is most likely a programming error. \
Please submit a bug report to launchpad""")
error_dialog = gtk.MessageDialog(parent=None, flags=gtk.DIALOG_MODAL,
type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_NONE,
message_format=message)
error_dialog.set_title(_('Error'))
error_dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
if not exception_type == PyroomError:
error_dialog.add_button (_("Details..."), 2)
error_dialog.set_position(gtk.WIN_POS_CENTER)
error_dialog.set_gravity(gtk.gdk.GRAVITY_CENTER)
error_dialog.show_all()
details_textview = gtk.TextView()
details_textview.show()
details_textview.set_editable(False)
details_textview.modify_font(pango.FontDescription('Monospace'))
scrolled_window = gtk.ScrolledWindow()
scrolled_window.show()
scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolled_window.add(details_textview)
frame = gtk.Frame()
frame.set_shadow_type(gtk.SHADOW_IN)
frame.add(scrolled_window)
frame.set_border_width(6)
error_dialog.vbox.add(frame)
details_buffer = details_textview.get_buffer()
printable_traceback = "\n".join(
traceback.format_exception(
exception_type,
exception_value,
exception_traceback,
)
)
details_buffer.set_text(printable_traceback)
details_textview.set_size_request(
gtk.gdk.screen_width()/2,
gtk.gdk.screen_height()/3
)
error_dialog.details = frame
while True:
resp = error_dialog.run()
if resp == 2:
error_dialog.details.show()
error_dialog.action_area.get_children()\
[0].set_sensitive(0)
else:
break
error_dialog.destroy()
|