finished first draft of introduction
This commit is contained in:
parent
998d943573
commit
5e5676adc9
1 changed files with 117 additions and 35 deletions
136
introduction.tex
136
introduction.tex
|
@ -262,20 +262,21 @@ consists of the following elements:
|
||||||
|
|
||||||
\footnotetext{Introduced in Java 7, see \url{https://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html} for more details.}
|
\footnotetext{Introduced in Java 7, see \url{https://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html} for more details.}
|
||||||
|
|
||||||
\section{Exception handling in other programming languages}
|
\subsection{Exception handling in other programming languages}
|
||||||
|
|
||||||
In almost all programming languages, errors can appear (either through the
|
In almost all programming languages, errors can appear (either through the
|
||||||
developer, the user or the system's fault), and must be dealt with.
|
developer, the user or the system's fault), and must be dealt with. Most of the
|
||||||
Most of the popular object oriented programs feature some kind of error system,
|
popular object oriented programs feature some kind of error system, normally
|
||||||
normally very similar to Java's exceptions. In this section, we will perform a
|
very similar to Java's exceptions. In this section, we will perform a small
|
||||||
small survey of the error-handling techniques used on the most popular
|
survey of the error-handling techniques used on the most popular programming
|
||||||
programming languages. The language list has been extracted from a survey
|
languages. The language list has been extracted from a survey performed by the
|
||||||
performed by the programming Q\&A website Stack
|
programming Q\&A website Stack
|
||||||
Overflow\footnote{\url{https://stackoverflow.com}}. The survey contains a
|
Overflow\footnote{\url{https://stackoverflow.com}}. The survey contains a
|
||||||
question about the technologies used by professional developers in their work,
|
question about the technologies used by professional developers in their work,
|
||||||
and from that list we have extracted those languages with more than $5\%$ usage
|
and from that list we have extracted those languages with more than $5\%$ usage
|
||||||
in the industry. Table~\ref{tab:popular-languages} shows the list and its
|
in the industry. Table~\ref{tab:popular-languages} shows the list and its
|
||||||
source.
|
source. Except Bash, Assembly, VBA, C and G, the rest of the languages shown
|
||||||
|
feature an exception system similar to the one appearing in Java.
|
||||||
|
|
||||||
\begin{table}
|
\begin{table}
|
||||||
\begin{minipage}{0.6\linewidth}
|
\begin{minipage}{0.6\linewidth}
|
||||||
|
@ -317,25 +318,106 @@ source.
|
||||||
|
|
||||||
\footnotetext{Data from \url{https://insights.stackoverflow.com/survey/2019/\#technology-\_-programming-scripting-and-markup-languages}}
|
\footnotetext{Data from \url{https://insights.stackoverflow.com/survey/2019/\#technology-\_-programming-scripting-and-markup-languages}}
|
||||||
|
|
||||||
|
The exception systems that are similar to Java are mostly all the same,
|
||||||
|
featuring a \texttt{throw} statement (\texttt{raise} in Python), try-catching
|
||||||
|
structure and most include a finally block that may be appended to try blocks.
|
||||||
|
The difference resides in the value passed by the exception, which in languages
|
||||||
|
that feature inheritance it is a class descending from a generic error or
|
||||||
|
exception, and in languages without it, it is an arbitrary value (e.g.
|
||||||
|
JavaScript, TypeScript). In object--oriented programming, the filtering is
|
||||||
|
performed by comparing if the exception is a subtype of the exception being
|
||||||
|
caught (Java, C++, C\#, PowerShell\footnotemark, etc.); and in languages with
|
||||||
|
arbitrary exception values, a boolean condition is specified, and the first
|
||||||
|
catch block that fulfills its condition is activated, in following a pattern
|
||||||
|
similar to that of \texttt{switch} statements (e.g. JavaScript). In both cases
|
||||||
|
there exists a way to indicate that all exceptions should be caught, regardless
|
||||||
|
of type and content.
|
||||||
|
|
||||||
Most of them feature an exception system similar to the one appearing in Java,
|
\footnotetext{Only since version 2.0, released with Windows 7.}
|
||||||
while others (bash, assembly, VBA, C) have no built-in method, but allow
|
|
||||||
\carlos{todo}. Some
|
|
||||||
check if the exception is of a given set of types for the catching mechanism
|
|
||||||
(Java, C++, C\#), whilst others rely on a condition that includes the exception
|
|
||||||
(Python, JavaScript, TypeScript). All of them have a mechanism that catches all
|
|
||||||
exceptions ---either by catching the type from which all exceptions inherit or
|
|
||||||
by providing no condition to check.
|
|
||||||
|
|
||||||
Go doesn't have an exception system per se, but a simple one can be built by
|
On the other hand, in the other languages there exist a variety of systems that
|
||||||
using the keywords ``panic'' (throw an exception with a value associated),
|
emulate or replace exception handling:
|
||||||
``defer'' (finally, run even when a panic is activated) and ``recover''
|
|
||||||
(stopping the panic state, retrieves the value associated with the panic).
|
|
||||||
Deferred code will be run after the main function ends, before the program
|
|
||||||
terminates. Each block is stored as a member of a stack, so the execution order
|
|
||||||
is LIFO. If a panic instruction is run, such code will still run, therefore
|
|
||||||
acting as a finally. The panic can only be stopped via the ``recover''
|
|
||||||
instruction, which obtains the value associated with the panic. Then, the
|
|
||||||
exception
|
|
||||||
|
|
||||||
% vim: set noexpandtab:tabstop=2:sw=2:wrap
|
\begin{description} % bash, vba, C and Go exceptions explained
|
||||||
|
\item[Bash] The popular Bourne Again SHell features no exception system, apart
|
||||||
|
from the user's ability to parse the return code from the last statement
|
||||||
|
executed. Traps can also be used to capture erroneous states and tidy up all
|
||||||
|
files and environment variables before exiting the program. Traps allow the
|
||||||
|
programmer to react to a user or system--sent signal, or an exit run from
|
||||||
|
within the Bash environment. When a trap is activated, its code run, and the
|
||||||
|
signal doesn't proceed and stop the program. This doesn't replace a fully
|
||||||
|
featured exception system, but \texttt{bash} programs tend to be small in
|
||||||
|
size, with programmers preferring the efficiency of C or the commodities of
|
||||||
|
other high--level languages when the task requires it.
|
||||||
|
\item[VBA] Visual Basic for Applications is a scripting programming language
|
||||||
|
based on Visual Basic that is integrated into Microsoft Office to automate
|
||||||
|
small tasks, such as generating documents from templates, making advanced
|
||||||
|
computations that are impossible or slower with spreadsheet functions, etc.
|
||||||
|
The only error--correcting system it has is the directive \texttt{On Error
|
||||||
|
$x$}, where $x$ can be 0 ---lets the error crash the program---,
|
||||||
|
\texttt{Next} ---continues the execution as if nothing had happened--- or a
|
||||||
|
label in the program ---the execution jumps to the label in case of
|
||||||
|
error. The directive can be set and reset multiple times, therefore creating
|
||||||
|
artificial \texttt{try-catch} blocks, but there is no possibility of
|
||||||
|
attaching a value to the error, lowering its usefulness.
|
||||||
|
\item[C] In C, errors can also be control via return values, but some of the
|
||||||
|
instructions it features can be used to create a simple exception system.
|
||||||
|
\texttt{setjmp} and \texttt{longjmp} are two instructions which set up and
|
||||||
|
perform inter--function jumps. The first makes a snapshot of the call stack
|
||||||
|
in a buffer, and the second returns to the position where the buffer was
|
||||||
|
safe, destroying the current state of the stack and replacing it with the
|
||||||
|
snapshot. Then, the execution continues from the evaluation of
|
||||||
|
\texttt{setjmp}, which returns the second argument passed to
|
||||||
|
\texttt{longjmp}. An example can be seen in figure~\ref{fig:exceptions-c},
|
||||||
|
where line 2 of the \texttt{main} function will be executed twice, once when
|
||||||
|
it is normally run (returning 0) and the second when line 3 in
|
||||||
|
\texttt{safe\_sqrt} is run, returning the second argument of line 3, and
|
||||||
|
therefore entering the else block in the \texttt{main} method.
|
||||||
|
\item[Go] The programming language Go is the odd one out in this section, being a
|
||||||
|
modern programming language without exceptions, though it is an intentional
|
||||||
|
design decision made by its authors\footnotemark. The argument made was that
|
||||||
|
exception handling systems introduce abnormal control--flow and complicate
|
||||||
|
code analysis and clean code generation, as it is not clear the paths that
|
||||||
|
the code may follow. Instead, Go allows functions to return multiple values,
|
||||||
|
with the second value typically associated to an error type. The error is
|
||||||
|
checked before the value, and acted upon. Additionally, Go also features a
|
||||||
|
simple panic system, with the functions \texttt{panic} ---throws an
|
||||||
|
exception with a value associated---, \texttt{defer} ---runs after the
|
||||||
|
function has ended or when a \texttt{panic} has been activated--- and
|
||||||
|
\texttt{recover} ---stops the panic state and retrieves its value. The
|
||||||
|
\texttt{defer} statement doubles as catch and finally, and multiple
|
||||||
|
instances can be accumulated. When appropriate, they will run in LIFO order
|
||||||
|
(Last In--First Out).
|
||||||
|
Then, the exception \carlos{complete}
|
||||||
|
\end{description}
|
||||||
|
|
||||||
|
\footnotetext{\url{https://golang.org/doc/faq#exceptions}}
|
||||||
|
|
||||||
|
\begin{figure} % example of exception system in C
|
||||||
|
\centering
|
||||||
|
\begin{minipage}{0.5\linewidth}
|
||||||
|
\begin{lstlisting}[language=C]
|
||||||
|
int main() {
|
||||||
|
if (!setjmp(ref)) {
|
||||||
|
res = safe_sqrt(x, ref);
|
||||||
|
} else {
|
||||||
|
// Handle error
|
||||||
|
printf /* ... */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{minipage}
|
||||||
|
\begin{minipage}{0.49\linewidth}
|
||||||
|
\begin{lstlisting}[language=C]
|
||||||
|
double safe_sqrt(double x, int ref) {
|
||||||
|
if (x < 0)
|
||||||
|
longjmp(ref, 1);
|
||||||
|
return /* ... */;
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{minipage}
|
||||||
|
\caption{A user-created exception system in C}
|
||||||
|
\label{fig:exceptions-c}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
% vim: set noexpandtab:tabstop=2:shiftwidth=2:softtabstop=2:wrap
|
||||||
|
|
Loading…
Reference in a new issue