-
Notifications
You must be signed in to change notification settings - Fork 4
/
part09.tex
198 lines (156 loc) · 4.54 KB
/
part09.tex
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
\documentclass[english,serif,mathserif,xcolor=pdftex,dvipsnames,table]{beamer}
\usetheme[informal]{s3it}
\usepackage{s3it}
\title[Part 9]{%
Exceptions
}
\author[S3IT]{%
S3IT: Services and Support for Science IT, \\
University of Zurich
}
\date{June~23--24, 2014}
\begin{document}
% title frame
\maketitle
\begin{frame}[fragile]
\frametitle{Exceptions}
``Exceptions'' is the name given in Python to error conditions.
\+
You can write code that intercepts some error conditions and
reacts.
% Exceptions are objects that inherit from the built-in
% \lstinline|Exception| class.
% \+
% To create a new exception just make a new class:
% \begin{lstlisting}
% class NewKindOfError(Exception):
% """
% Do use the docstring to document
% what this error is about.
% """
% pass
% \end{lstlisting}
% \+
% Exceptions are handled by class name, so they usually do not need
% any new methods (although you are free to define some if needed).
\begin{seealso}
\url{http://docs.python.org/library/exceptions.html}
\end{seealso}
\end{frame}
\begin{frame}[fragile]
\frametitle{What does an exception look like?}
\begin{lstlisting}
>>> stream.write('foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: File not open for writing
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{What does an exception look like?}
\begin{lstlisting}
>>> stream.write('foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: ~\HL{File not open for writing}~
\end{lstlisting}
\+
This is the exception \emph{message}: it is supposed to be read
by the (human) user.
\end{frame}
\begin{frame}[fragile]
\frametitle{What does an exception look like?}
\begin{lstlisting}
>>> stream.write('foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
~\HL{IOError}~: File not open for writing
\end{lstlisting}
\+ This is the exception \emph{class name}; it is used for catching
exceptions (syntax in the next slide).
\end{frame}
\begin{frame}[fragile]
\begin{lstlisting}
try:
# code that might raise an exception
except SomeException:
# handle some exception
except AnotherException, ex:
# the actual Exception instance
# is available as variable `ex'
finally:
# performed on exit in any case
\end{lstlisting}
\+
The optional \lstinline|finally| clause is executed on exit from the
\lstinline|try| or \lstinline|except| block in \emph{any} case.
\begin{references}
\scriptsize
\url{http://docs.python.org/reference/compound_stmts.html#try}
\end{references}
\end{frame}
\begin{frame}[fragile]
\frametitle{Raising exceptions}
Use the \lstinline|raise| statement with an \texttt{Exception}
instance:
\begin{lstlisting}
if an_error_occurred:
raise AnError("Spider sense is tingling.")
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Raising exceptions}
Use the \lstinline|raise| statement with an \texttt{Exception}
instance:
\begin{lstlisting}
if an_error_occurred:
raise ~\HL{AnError}~("Spider sense is tingling.")
\end{lstlisting}
\+
The exception class name specifies what kind of exception to raise.
\+
You must use an \emph{existing} exception class; we shall learn
how to define new exceptions in the object-orientation lectures.
\end{frame}
\begin{frame}[fragile]
\frametitle{Raising exceptions}
Use the \lstinline|raise| statement with an \texttt{Exception}
instance:
\begin{lstlisting}
if an_error_occurred:
raise AnError(~\HL{"Spider sense is tingling."}~)
\end{lstlisting}
\+
The exception message is an arbitrary string. It is meant for
humans to read, so try to describe the error condition clearly and
concisely.
\end{frame}
\begin{frame}[fragile]
\frametitle{Raising exceptions}
Within an \lstinline|except| clause, you can use \lstinline|raise|
with no arguments to re-raise the current exception:
\begin{lstlisting}
try:
something()
except ItDidntWork:
do_cleanup()
# re-raise exception to caller
raise
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\begin{exercise}
Enhance the function \lstinline|parse_data| defined in the ``Warm-up''
Exercise: if an error is found in the data read from file,
silently ignore it and drop the line.
Test your code on the
\href{https://raw.github.com/gc3-uzh-ch/python-course/master/rt.tsv}{\texttt{rt.dirty.csv}}
data file: your code should detect and ignore the 4 malformed
lines in the file.
\end{exercise}
\end{frame}
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End: