{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Error Handling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Try, Except, Finally" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n", "=== Except block ===\n" ] } ], "source": [ "try:\n", " print(\"=== Try block ===\")\n", " if \"10\" > 10:\n", " print(\"Content in try block after error encountered\")\n", "except:\n", " print(\"=== Except block ===\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Capture Exception Type" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n", "=== Except block ===\n", "<class 'TypeError'> encountered:\n", " '>' not supported between instances of 'str' and 'int'\n" ] } ], "source": [ "try:\n", " print(\"=== Try block ===\")\n", " if \"10\" > 10:\n", " print(\"Content in try block after error encountered\")\n", "except Exception as exp:\n", " print(\"=== Except block ===\")\n", " print(type(exp), \"encountered:\") # Exception type\n", " print(\" \", exp) # Exception message" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deal With Different Kinds of Exception" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n" ] } ], "source": [ "a = 10\n", "b = \"10\"\n", "\n", "try:\n", " print(\"=== Try block ===\")\n", " if a > int(b):\n", " print(\"Content in try block after error encountered\")\n", "except TypeError:\n", " print(\"=== Except block 1 ===\")\n", " print(\"TypeError encountered, check input of a\")\n", "except ValueError:\n", " print(\"=== Except block 2 ===\")\n", " print(\"ValueError encountered, check input of b\")" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n", "=== Except block 1 ===\n", "TypeError encountered, check input of a\n" ] } ], "source": [ "a = \"10\"\n", "b = \"10\"\n", "\n", "try:\n", " print(\"=== Try block ===\")\n", " if a > int(b):\n", " print(\"Content in try block after error encountered\")\n", "except TypeError:\n", " print(\"=== Except block 1 ===\")\n", " print(\"TypeError encountered, check input of a\")\n", "except ValueError:\n", " print(\"=== Except block 2 ===\")\n", " print(\"ValueError encountered, check input of b\")" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n", "=== Except block 2 ===\n", "ValueError encountered, check input of b\n" ] } ], "source": [ "a = 10\n", "b = \"k\"\n", "\n", "try:\n", " print(\"=== Try block ===\")\n", " if a > int(b):\n", " print(\"Content in try block after error encountered\")\n", "except TypeError:\n", " print(\"=== Except block 1 ===\")\n", " print(\"TypeError encountered, check input of a\")\n", "except ValueError:\n", " print(\"=== Except block 2 ===\")\n", " print(\"ValueError encountered, check input of b\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Clean up with `finally`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we return early (e.g in try-except blocks), the rest of the code won't be excecuted." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "def fun(a, b):\n", " try:\n", " print(\"=== Try block ===\")\n", " if a > int(b):\n", " print(\"Content in try block after error encountered\")\n", " except TypeError:\n", " print(\"=== Except block 1 ===\")\n", " print(\"TypeError encountered, check input of a\")\n", " return 1\n", " except ValueError:\n", " print(\"=== Except block 2 ===\")\n", " print(\"ValueError encountered, check input of b\")\n", " return 2\n", " \n", " print(\"This will not be printed if exception encounterd\")\n", " return 0" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n", "=== Except block 2 ===\n", "ValueError encountered, check input of b\n" ] } ], "source": [ "x = fun(10, \"k\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you some code **must be run** after the try-except blocks, a better way is to use the `finally` block.\n", "\n", "`finally` block is a good way to clean up code (such as closing the file)." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "def fun(a, b):\n", " try:\n", " print(\"=== Try block ===\")\n", " if a > int(b):\n", " print(\"Content in try block after error encountered\")\n", " except TypeError:\n", " print(\"=== Except block 1 ===\")\n", " print(\"TypeError encountered, check input of a\")\n", " return 1\n", " except ValueError:\n", " print(\"=== Except block 2 ===\")\n", " print(\"ValueError encountered, check input of b\")\n", " return 2\n", " # Code here is executed no matter whether except block that was executed\n", " finally: \n", " print(\"This is always printed\")\n", " \n", " return 0" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Try block ===\n", "=== Except block 2 ===\n", "ValueError encountered, check input of b\n", "This is always printed\n" ] } ], "source": [ "x = fun(10, \"k\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Raising Exception" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To raise a (self-defined) exception in a function, use the expression `raise Exception(\"exception-name\")`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "def fun(prob):\n", " if not 0 <= prob <= 1:\n", " raise Exception(\"InvalidProb\")\n", " return prob\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "fun(1.5)\n", "```\n", "\n", "```\n", "---------------------------------------------------------------------------\n", "Exception Traceback (most recent call last)\n", "<ipython-input-40-0dd1cabf5a55> in <module>\n", "----> 1 fun(1.5)\n", "\n", "<ipython-input-39-98ccab9d5d44> in fun(prob)\n", " 1 def fun(prob):\n", " 2 if not 0 <= prob <= 1:\n", "----> 3 raise Exception(\"InvalidProb\")\n", " 4 return prob\n", "\n", "Exception: InvalidProb\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can then capture this exception with an `except` block:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "def safeFun(prob):\n", " try:\n", " prob = fun(prob)\n", " except Exception as exp:\n", " print('Exception encountered: %s' % str(exp))\n", " prob = 0\n", " \n", " return prob" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exception encountered: InvalidProb\n" ] } ], "source": [ "x = safeFun(1.5)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }