Graceful exit
Simple programming idiom in a program to detect and manage a serious error condition
- 3 min read
- 3 chapters
Related on Lably
Through Computer program, Error and Exception handling
Usually, code for a graceful exit exists when the alternative — allowing the error to go undetected and unhandled — would produce spurious errors or later anomalous behavior that would be more difficult for the programmer to debug. The code associated with a graceful exit may also take additional steps, such as closing files, to ensure that the program leaves data in a consistent, recoverable state.
Graceful exits are not always desired. In many cases, an outright crash can give the software developer the opportunity to attach a debugger or collect important information, such as a core dump or stack trace, to diagnose the root cause of the error.
In a language that supports formal exception handling, a graceful exit may be the final step in the handling of an exception. In other languages graceful exits can be implemented with additional statements at the locations of possible errors.
The phrase "graceful exit" has also been generalized to refer to letting go from a job or relationship in life that has ended.
In Perl
In the Perl programming language, graceful exits are generally implemented via the die operator. For example, the code for opening a file often reads like the following:
<span id="mwKg"></span><span class="c1" id="mwKw"># Open the file 'myresults' for writing, or die with an appropriate error message.</span> <span class="nb" id="mwLA">open</span><span class="w" id="mwLQ"> </span><span class="n" id="mwLg">RESULTS</span><span class="p" id="mwLw">,</span><span class="w" id="mwMA"> </span><span class="s" id="mwMQ">'>'</span><span class="p" id="mwMg">,</span><span class="w" id="mwMw"> </span><span class="s" id="mwNA">'myresults'</span><span class="w" id="mwNQ"> </span><span class="ow" id="mwNg">or</span><span class="w" id="mwNw"> </span><span class="nb" id="mwOA">die</span><span class="w" id="mwOQ"> </span><span class="s" id="mwOg">"can't write to 'myresults' file: $!"</span><span class="p" id="mwOw">;</span>
If the attempt to open the file myresults fails, the containing program will terminate with an error message and an exit status indicating abnormal termination.
Sign in to keep reading
2 more chapters are free with a Lably account.
In Java
In the Java programming language, the try...catch block is used often to catch exceptions. All potentially dangerous code is placed inside the block and, if an exception occurred, is stopped, or caught.
<span id="mwRw"></span><span class="k" id="mwSA">try</span><span class="w" id="mwSQ"> </span><span class="p" id="mwSg">{</span> <span class="w" id="mwSw"> </span><span class="c1" id="mwTA">// Try to read the file "file.txt"</span> <span class="w" id="mwTQ"> </span><span class="n" id="mwTg">Scanner</span><span class="w" id="mwTw"> </span><span class="n" id="mwUA">sc</span><span class="w" id="mwUQ"> </span><span class="o" id="mwUg">=</span><span class="w" id="mwUw"> </span><span class="k" id="mwVA">new</span><span class="w" id="mwVQ"> </span><span class="n" id="mwVg">Scanner</span><span class="p" id="mwVw">(</span><span class="k" id="mwWA">new</span><span class="w" id="mwWQ"> </span><span class="n" id="mwWg">File</span><span class="p" id="mwWw">(</span><span class="s" id="mwXA">"file.txt"</span><span class="p" id="mwXQ">));</span> <span class="w" id="mwXg"> </span><span class="k" id="mwXw">while</span><span class="w" id="mwYA"> </span><span class="p" id="mwYQ">(</span><span class="n" id="mwYg">sc</span><span class="p" id="mwYw">.</span><span class="na" id="mwZA">hasNextLine</span><span class="p" id="mwZQ">())</span> <span class="w" id="mwZg"> </span><span class="n" id="mwZw">System</span><span class="p" id="mwaA">.</span><span class="na" id="mwaQ">out</span><span class="p" id="mwag">.</span><span class="na" id="mwaw">println</span><span class="p" id="mwbA">(</span><span class="n" id="mwbQ">sc</span><span class="p" id="mwbg">.</span><span class="na" id="mwbw">readLine</span><span class="p" id="mwcA">());</span> <span class="w" id="mwcQ"> </span><span class="n" id="mwcg">sc</span><span class="p" id="mwcw">.</span><span class="na" id="mwdA">close</span><span class="p" id="mwdQ">();</span> <span class="p" id="mwdg">}</span><span class="w" id="mwdw"> </span><span class="k" id="mweA">catch</span><span class="p" id="mweQ">(</span><span class="n" id="mweg">IOException</span><span class="w" id="mwew"> </span><span class="n" id="mwfA">e</span><span class="p" id="mwfQ">)</span><span class="w" id="mwfg"> </span><span class="p" id="mwfw">{</span> <span class="w" id="mwgA"> </span><span class="c1" id="mwgQ">// The file could not be read</span> <span class="w" id="mwgg"> </span><span class="n" id="mwgw">System</span><span class="p" id="mwhA">.</span><span class="na" id="mwhQ">err</span><span class="p" id="mwhg">.</span><span class="na" id="mwhw">println</span><span class="p" id="mwiA">(</span><span class="s" id="mwiQ">"The file could not be read. Stack trace:"</span><span class="p" id="mwig">);</span> <span class="w" id="mwiw"> </span><span class="n" id="mwjA">e</span><span class="p" id="mwjQ">.</span><span class="na" id="mwjg">printStackTrace</span><span class="p" id="mwjw">();</span> <span class="p" id="mwkA">}</span>In C
In C one can use the error(3) function, provided in GNU by the GNU C Library.
<span id="mwmQ"></span><span class="kt" id="mwmg">int</span><span class="w" id="mwmw"> </span><span class="n" id="mwnA">fd</span><span class="p" id="mwnQ">;</span> <span class="k" id="mwng">if</span><span class="w" id="mwnw"> </span><span class="p" id="mwoA">((</span><span class="n" id="mwoQ">fd</span><span class="w" id="mwog"> </span><span class="o" id="mwow">=</span><span class="w" id="mwpA"> </span><span class="n" id="mwpQ">open</span><span class="p" id="mwpg">(</span><span class="s" id="mwpw">"/dev/urandom"</span><span class="p" id="mwqA">,</span><span class="w" id="mwqQ"> </span><span class="n" id="mwqg">O_RDONLY</span><span class="p" id="mwqw">))</span><span class="w" id="mwrA"> </span><span class="o" id="mwrQ"><</span><span class="w" id="mwrg"> </span><span class="mi" id="mwrw">0</span><span class="p" id="mwsA">)</span><span class="w" id="mwsQ"> </span><span class="n" id="mwsg">error</span><span class="p" id="mwsw">(</span><span class="mi" id="mwtA">1</span><span class="p" id="mwtQ">,</span><span class="w" id="mwtg"> </span><span class="n" id="mwtw">errno</span><span class="p" id="mwuA">,</span><span class="w" id="mwuQ"> </span><span class="s" id="mwug">"Open failed"</span><span class="p" id="mwuw">);</span>
If the first parameter is non-zero this function will exit from the parent process and return that parameter.

