Intercept common IO errors exceptions.
When the task directory doesn't exist or when a file can't be read or written,
t.py fails with a full stacktrace exception. This change allows t.py to fail
more gracefully, printing the exception message, the relevant file, and then
exiting with an errorlevel code of 1.
# Non existant directory issue
/home/dereckson/dev/t ] ./t.py -t /nonexistent Lorem ipsum dolor
No such file or directory - /nonexistent/tasks
# File permission issue
/home/dereckson/dev/t ] mkdir test
/home/dereckson/dev/t ] ./t.py -t test Lorem ipsum dolor
/home/dereckson/dev/t ] chmod 000 test/.tasks.done
/home/dereckson/dev/t ] ./t.py -t test Lorem ipsum dolor
Permission denied - test/.tasks.done
author |
Dereckson |
date |
Sat, 31 Aug 2013 10:31:43 +0200 |
parents |
1c496e933168
|
children |
bc7821308e0b
|
branches/tags |
(none) |
files |
t.py |
Changes
--- a/t.py Tue Oct 09 13:46:00 2012 -0400
+++ b/t.py Sat Aug 31 10:31:43 2013 +0200
@@ -134,12 +134,15 @@
if os.path.isdir(path):
raise InvalidTaskfile
if os.path.exists(path):
- with open(path, 'r') as tfile:
- tls = [tl.strip() for tl in tfile if tl]
- tasks = map(_task_from_taskline, tls)
- for task in tasks:
- if task is not None:
- getattr(self, kind)[task['id']] = task
+ try:
+ with open(path, 'r') as tfile:
+ tls = [tl.strip() for tl in tfile if tl]
+ tasks = map(_task_from_taskline, tls)
+ for task in tasks:
+ if task is not None:
+ getattr(self, kind)[task['id']] = task
+ except IOError as e:
+ sys.exit(e.strerror + ' - ' + path)
def __getitem__(self, prefix):
"""Return the unfinished task with the given prefix.
@@ -230,9 +233,13 @@
raise InvalidTaskfile
tasks = sorted(getattr(self, kind).values(), key=itemgetter('id'))
if tasks or not delete_if_empty:
- with open(path, 'w') as tfile:
- for taskline in _tasklines_from_tasks(tasks):
- tfile.write(taskline)
+ try:
+ with open(path, 'w') as tfile:
+ for taskline in _tasklines_from_tasks(tasks):
+ tfile.write(taskline)
+ except IOError as e:
+ sys.exit(e.strerror + ' - ' + path)
+
elif not tasks and os.path.isfile(path):
os.remove(path)