Skip to content

Commit 01f63aa

Browse files
hermansjeTimSangster
authored andcommitted
Add basic attribute handling in exception handlers
1 parent aba2aa5 commit 01f63aa

File tree

2 files changed

+54
-7
lines changed

2 files changed

+54
-7
lines changed

‎pythonwhat/parsing.py‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ def visit_Try(self, node):
816816
handlers[el.id] = self.parse_handler(handler)
817817
else:
818818
# either general handler, or single error handler
819-
k = "all" if not handler.type else handler.type.id
819+
k = "all" if not handler.type else self.get_identifier(handler.type)
820820
handlers[k] = self.parse_handler(handler)
821821

822822
self.out.append(
@@ -829,6 +829,18 @@ def visit_Try(self, node):
829829
}
830830
)
831831

832+
@staticmethod
833+
def get_identifier(obj):
834+
# if only name needs to be correct
835+
return getattr(obj, "id", None) or getattr(obj, "attr")
836+
# if full attr chain must match
837+
# name = ""
838+
# while hasattr(obj, "attr"):
839+
# name = "." + obj.attr + name
840+
# obj = obj.value
841+
# name = obj.id + name
842+
# return name
843+
832844
@staticmethod
833845
def parse_handler(handler):
834846
return {"node": handler.body, "target_vars": TargetVars([handler.name])}

‎tests/test_check_try_except.py‎

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ def data():
1111
x = max([1, 2, 'a'])
1212
except TypeError as e:
1313
x = 'typeerror'
14-
except ValueError:
14+
except __builtin__.ValueError:
1515
x = 'valueerror'
1616
except (ZeroDivisionError, IOError) as e:
1717
x = e
18+
except pd.io.common.CParserError:
19+
x = 'CParserError'
1820
except :
1921
x = 'someerror'
2022
else :
@@ -29,6 +31,7 @@ def data():
2931
check_handlers('ValueError').has_equal_value(name = 'x'),
3032
check_handlers('ZeroDivisionError').set_context(e = 'anerror').has_equal_value(name = 'x'),
3133
check_handlers('IOError').set_context(e = 'anerror').has_equal_value(name = 'x'),
34+
check_handlers('CParserError').has_equal_value(name = 'x'),
3235
check_handlers('all').has_equal_value(name = 'x'),
3336
check_orelse().has_equal_value(name = 'passed'),
3437
check_finalbody().check_function('print').check_args(0).has_equal_value()
@@ -197,13 +200,35 @@ def test_fail_09(data):
197200
"""
198201
sct_payload = helper.run(data)
199202
assert not sct_payload["correct"]
203+
assert (
204+
sct_payload["message"]
205+
== "Check the first try statement. Are you sure you defined the <code>CParserError</code> <code>except</code> block?"
206+
)
207+
208+
def test_fail_10(data):
209+
data[
210+
"DC_CODE"
211+
] = """
212+
try:
213+
x = max([1, 2, 'a'])
214+
except TypeError as e:
215+
x = 'typeerror'
216+
except ValueError:
217+
x = 'valueerror'
218+
except (ZeroDivisionError, IOError) as e:
219+
x = e
220+
except pd.io.common.CParserError as e:
221+
x = 'CParserError'
222+
"""
223+
sct_payload = helper.run(data)
224+
assert not sct_payload["correct"]
200225
assert (
201226
sct_payload["message"]
202227
== "Check the first try statement. Are you sure you defined the <code>all</code> <code>except</code> block?"
203228
)
204229

205230

206-
def test_fail_10(data):
231+
def test_fail_11(data):
207232
data[
208233
"DC_CODE"
209234
] = """
@@ -215,6 +240,8 @@ def test_fail_10(data):
215240
x = 'valueerror'
216241
except (ZeroDivisionError, IOError) as e:
217242
x = e
243+
except pd.io.common.CParserError as e:
244+
x = 'CParserError'
218245
except :
219246
x = 'someerrors'
220247
"""
@@ -226,7 +253,7 @@ def test_fail_10(data):
226253
)
227254

228255

229-
def test_fail_11(data):
256+
def test_fail_12(data):
230257
data[
231258
"DC_CODE"
232259
] = """
@@ -238,6 +265,8 @@ def test_fail_11(data):
238265
x = 'valueerror'
239266
except (ZeroDivisionError, IOError) as e:
240267
x = e
268+
except pd.io.common.CParserError as e:
269+
x = 'CParserError'
241270
except :
242271
x = 'someerror'
243272
"""
@@ -249,7 +278,7 @@ def test_fail_11(data):
249278
)
250279

251280

252-
def test_fail_12(data):
281+
def test_fail_13(data):
253282
data[
254283
"DC_CODE"
255284
] = """
@@ -261,6 +290,8 @@ def test_fail_12(data):
261290
x = 'valueerror'
262291
except (ZeroDivisionError, IOError) as e:
263292
x = e
293+
except pd.io.common.CParserError as e:
294+
x = 'CParserError'
264295
except :
265296
x = 'someerror'
266297
else :
@@ -274,7 +305,7 @@ def test_fail_12(data):
274305
)
275306

276307

277-
def test_fail_13(data):
308+
def test_fail_14(data):
278309
data[
279310
"DC_CODE"
280311
] = """
@@ -286,6 +317,8 @@ def test_fail_13(data):
286317
x = 'valueerror'
287318
except (ZeroDivisionError, IOError) as e:
288319
x = e
320+
except pd.io.common.CParserError as e:
321+
x = 'CParserError'
289322
except :
290323
x = 'someerror'
291324
else :
@@ -299,7 +332,7 @@ def test_fail_13(data):
299332
)
300333

301334

302-
def test_fail_14(data):
335+
def test_fail_15(data):
303336
data[
304337
"DC_CODE"
305338
] = """
@@ -311,6 +344,8 @@ def test_fail_14(data):
311344
x = 'valueerror'
312345
except (ZeroDivisionError, IOError) as e:
313346
x = e
347+
except pd.io.common.CParserError as e:
348+
x = 'CParserError'
314349
except :
315350
x = 'someerror'
316351
else :

0 commit comments

Comments
 (0)