-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #798 from cmccandless/implement-error-handling
error-handling: implement exercise
- Loading branch information
Showing
5 changed files
with
134 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# Error Handling | ||
|
||
Implement various kinds of error handling and resource management. | ||
|
||
An important point of programming is how to handle errors and close | ||
resources even if errors occur. | ||
|
||
This exercise requires you to handle various errors. Because error handling | ||
is rather programming language specific you'll have to refer to the tests | ||
for your track to see what's exactly required. | ||
|
||
### Submitting Exercises | ||
|
||
Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory. | ||
|
||
For example, if you're submitting `bob.py` for the Bob exercise, the submit command would be something like `exercism submit <path_to_exercism_dir>/python/bob/bob.py`. | ||
|
||
|
||
For more detailed information about running tests, code style and linting, | ||
please see the [help page](http://exercism.io/languages/python). | ||
|
||
## Submitting Incomplete Solutions | ||
It's possible to submit an incomplete solution so you can see how others have completed the exercise. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
def handle_error_by_throwing_exception(): | ||
pass | ||
|
||
|
||
def handle_error_by_returning_none(input_data): | ||
pass | ||
|
||
|
||
def handle_error_by_returning_tuple(input_data): | ||
pass | ||
|
||
|
||
def filelike_objects_are_closed_on_exception(filelike_object): | ||
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
import unittest | ||
|
||
import error_handling as er | ||
|
||
|
||
class FileLike(object): | ||
def __init__(self): | ||
self.is_open = False | ||
self.was_open = False | ||
self.did_something = False | ||
|
||
def open(self): | ||
self.was_open = False | ||
self.is_open = True | ||
|
||
def close(self): | ||
self.is_open = False | ||
self.was_open = True | ||
|
||
def __enter__(self): | ||
self.open() | ||
return self | ||
|
||
def __exit__(self, *args): | ||
self.close() | ||
|
||
def do_something(self): | ||
self.did_something = True | ||
raise Exception() | ||
|
||
|
||
class ErrorHandlingTest(unittest.TestCase): | ||
def test_throw_exception(self): | ||
with self.assertRaises(Exception): | ||
er.handle_error_by_throwing_exception() | ||
|
||
def test_return_none(self): | ||
self.assertEqual(er.handle_error_by_returning_none('1'), 1, | ||
'Result of valid input should not be None') | ||
self.assertIsNone(er.handle_error_by_returning_none('a'), | ||
'Result of invalid input should be None') | ||
|
||
def test_return_tuple(self): | ||
successful_result, result = er.handle_error_by_returning_tuple('1') | ||
self.assertIs(successful_result, True, | ||
'Valid input should be successful') | ||
self.assertEqual(result, 1, 'Result of valid input should not be None') | ||
|
||
failure_result, result = er.handle_error_by_returning_tuple('a') | ||
self.assertIs(failure_result, False, | ||
'Invalid input should not be successful') | ||
|
||
def test_filelike_objects_are_closed_on_exception(self): | ||
filelike_object = FileLike() | ||
with self.assertRaises(Exception): | ||
er.filelike_objects_are_closed_on_exception(filelike_object) | ||
self.assertIs(filelike_object.is_open, False, | ||
'filelike_object should be closed') | ||
self.assertIs(filelike_object.was_open, True, | ||
'filelike_object should have been opened') | ||
self.assertIs(filelike_object.did_something, True, | ||
'filelike_object should call do_something()') | ||
|
||
|
||
if __name__ == '__main__': | ||
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
def handle_error_by_throwing_exception(): | ||
raise Exception() | ||
|
||
|
||
def handle_error_by_returning_none(input_data): | ||
try: | ||
return int(input_data) | ||
except ValueError: | ||
return None | ||
|
||
|
||
def handle_error_by_returning_tuple(input_data): | ||
try: | ||
return (True, int(input_data)) | ||
except ValueError: | ||
return (False, None) | ||
|
||
|
||
def filelike_objects_are_closed_on_exception(filelike_object): | ||
with filelike_object as fobj: | ||
fobj.do_something() |