Skip to content

Commit bde7ec7

Browse files
committed
OWLoadClassifier: Show message about unpickling error
1 parent 909a119 commit bde7ec7

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

Orange/widgets/classify/owloadclassifier.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from Orange.widgets.utils import stdpaths
1313

1414
from Orange.widgets.classify import owsaveclassifier
15+
from Orange.widgets.widget import Msg
1516

1617

1718
class OWLoadClassifier(widget.OWWidget):
@@ -27,6 +28,9 @@ class OWLoadClassifier(widget.OWWidget):
2728
#: Current (last selected) filename or None.
2829
filename = Setting(None)
2930

31+
class Error(widget.OWWidget.Error):
32+
load_error = Msg("An error occured while reading '{}'")
33+
3034
FILTER = owsaveclassifier.OWSaveClassifier.FILTER
3135

3236
want_main_area = False
@@ -96,11 +100,10 @@ def load(self, filename):
96100
"""Load the object from filename and send it to output."""
97101
try:
98102
classifier = pickle.load(open(filename, "rb"))
99-
except pickle.UnpicklingError:
100-
raise # TODO: error reporting
101-
except os.error:
102-
raise # TODO: error reporting
103+
except (pickle.UnpicklingError, OSError, EOFError):
104+
self.Error.load_error(os.path.split(filename)[-1])
103105
else:
106+
self.Error.load_error.clear()
104107
self._remember(filename)
105108
self.send("Classifier", classifier)
106109

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Test methods with long descriptive names can omit docstrings
2+
# pylint: disable=missing-docstring
3+
import os
4+
import pickle
5+
from tempfile import mkstemp
6+
7+
from Orange.classification.majority import ConstantModel
8+
from Orange.widgets.classify.owloadclassifier import OWLoadClassifier
9+
from Orange.widgets.tests.base import WidgetTest
10+
11+
12+
class TestOWMajority(WidgetTest):
13+
def setUp(self):
14+
self.widget = self.create_widget(OWLoadClassifier)
15+
16+
def test_show_error(self):
17+
self.widget.load("no-such-file.pckls")
18+
self.assertTrue(self.widget.Error.load_error.is_shown())
19+
20+
clsf = ConstantModel([1, 1, 1])
21+
fd, fname = mkstemp(suffix='.pkcls')
22+
try:
23+
pickle.dump(clsf, open(fname, "wb"))
24+
self.widget.load(fname)
25+
self.assertFalse(self.widget.Error.load_error.is_shown())
26+
27+
open(fname, "w").write("X")
28+
self.widget.load(fname)
29+
self.assertTrue(self.widget.Error.load_error.is_shown())
30+
finally:
31+
os.remove(fname)
32+

0 commit comments

Comments
 (0)