{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 例外" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 例外の捕捉" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以下のコードは数値を$0$で割るため、実行するとエラー(例外)が発生する。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/4032807262.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m2.\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] } ], "source": [ "2. / 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "プログラム中でエラーが発生したときは、例外クラスのオブジェクトが作成・送出される。例えば、上の例では[ZeroDivisionError](https://docs.python.org/ja/3/library/exceptions.html#ZeroDivisionError)という例外クラスのオブジェクトが`'float division by zero'`というメッセージ付きで送出されている。\n", "\n", "プログラムの実行中に例外が発生するとPythonインタプリタの実行が直ちに停止されるが、 [try](https://docs.python.org/ja/3/reference/compound_stmts.html#the-try-statement)文およびexcept節を用いて、例外をプログラム中で捕捉することも可能である。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ゼロ除算: float division by zero\n" ] } ], "source": [ "try:\n", " 2. / 0\n", "except ZeroDivisionError as e:\n", " print('ゼロ除算:', e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "try文を用いても、except節で指定した例外クラス以外の例外が発生した場合は、except節は実行されずPythonインタプリタの実行が止まってしまう。以下のプログラムで発生する例外は[OverflowError](https://docs.python.org/ja/3/library/exceptions.html#OverflowError)であるため、ZeroDivisionErrorに関するexcept節では捕捉しきれない。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "OverflowError", "evalue": "(34, 'Numerical result out of range')", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mOverflowError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/1994322563.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;36m2.\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0;36m1024\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mZeroDivisionError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mOverflowError\u001b[0m: (34, 'Numerical result out of range')" ] } ], "source": [ "try:\n", " 2. ** 1024\n", "except ZeroDivisionError as e:\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "except節を複数並べることで、異なる複数の例外に対する処理を記述できる。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "オーバーフロー: (34, 'Numerical result out of range')\n" ] } ], "source": [ "try:\n", " 2. ** 1024\n", "except ZeroDivisionError as e:\n", " print('ゼロ除算:', e)\n", "except OverflowError as e:\n", " print('オーバーフロー:', e)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ゼロ除算: float division by zero\n" ] } ], "source": [ "try:\n", " 2. / 0\n", "except ZeroDivisionError as e:\n", " print('ゼロ除算:', e)\n", "except OverflowError as e:\n", " print('オーバーフロー:', e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "except節に例外クラスをタプルとしてまとめることで、異なる複数の例外に対する処理をまとめて記述できる。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例外: (34, 'Numerical result out of range')\n" ] } ], "source": [ "try:\n", " 2. ** 1024\n", "except (ZeroDivisionError, OverflowError) as e:\n", " print('例外:', type(e), e)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例外: float division by zero\n" ] } ], "source": [ "try:\n", " 2. / 0\n", "except (ZeroDivisionError, OverflowError) as e:\n", " print('例外:', type(e), e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "なお、ZeroDivisionErrorやOverflowErrorなどの組み込み例外の基底クラスは[Exception](https://docs.python.org/ja/3/library/exceptions.html#Exception)であるため、except節でExceptionクラスを指定すると、異なる種類の例外をまとめて捕捉できる。" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例外: (34, 'Numerical result out of range')\n" ] } ], "source": [ "try:\n", " 2. ** 1024\n", "except Exception as e:\n", " print('例外:', type(e), e)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例外: float division by zero\n" ] } ], "source": [ "try:\n", " 2. / 0\n", "except Exception as e:\n", " print('例外:', type(e), e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 例外の送出" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[raise](https://docs.python.org/ja/3/reference/simple_stmts.html#raise)文を用いると、自分で実装したコードの中から例外を送出できる。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def timestamp(hour, minute, second):\n", " if hour < 0 or 24 <= hour:\n", " raise ValueError(\"引数hourは0 <= hour < 24を満たす必要があります\")\n", " if minute < 0 or 60 <= minute:\n", " raise ValueError(\"引数minuteは0 <= minute < 60を満たす必要があります\")\n", " if second < 0 or 60 <= second:\n", " raise ValueError(\"引数secondは0 <= second < 60を満たす必要があります\")\n", " return hour * 3600 + minute * 60 + second" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "ValueError", "evalue": "引数secondは0 <= second < 60を満たす必要があります", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/3015373880.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtimestamp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m43\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m70\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/tmp/ipykernel_2793/1510188508.py\u001b[0m in \u001b[0;36mtimestamp\u001b[0;34m(hour, minute, second)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"引数minuteは0 <= minute < 60を満たす必要があります\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msecond\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;36m60\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"引数secondは0 <= second < 60を満たす必要があります\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mhour\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m3600\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mminute\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m60\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValueError\u001b[0m: 引数secondは0 <= second < 60を満たす必要があります" ] } ], "source": [ "timestamp(2, 43, 70)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "関数の呼び出し側にtry文を埋め込み、例外を捕捉することも可能である。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例外: 引数hourは0 <= hour < 24を満たす必要があります\n" ] } ], "source": [ "try:\n", " timestamp(48, 0, 0)\n", "except Exception as e:\n", " print('例外:', type(e), e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "例外クラスを自分で定義することもできる。ユーザ定義の例外クラスは[Exception](https://docs.python.org/ja/3/library/exceptions.html#Exception)を継承する必要がある。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "class TimestampError(Exception):\n", " pass\n", "\n", "def timestamp(hour, minute, second):\n", " if hour < 0 or 24 <= hour:\n", " raise TimestampError(\"引数hourは0 <= hour < 24を満たす必要があります\")\n", " if minute < 0 or 60 <= minute:\n", " raise TimestampError(\"引数minuteは0 <= minute < 60を満たす必要があります\")\n", " if second < 0 or 60 <= second:\n", " raise TimestampError(\"引数secondは0 <= second < 60を満たす必要があります\")\n", " return hour * 3600 + minute * 60 + second" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "TimestampError", "evalue": "引数minuteは0 <= minute < 60を満たす必要があります", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTimestampError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/3588777746.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtimestamp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m95\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m22\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/tmp/ipykernel_2793/4188596422.py\u001b[0m in \u001b[0;36mtimestamp\u001b[0;34m(hour, minute, second)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimestampError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"引数hourは0 <= hour < 24を満たす必要があります\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mminute\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;36m60\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mminute\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTimestampError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"引数minuteは0 <= minute < 60を満たす必要があります\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msecond\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;36m60\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimestampError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"引数secondは0 <= second < 60を満たす必要があります\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTimestampError\u001b[0m: 引数minuteは0 <= minute < 60を満たす必要があります" ] } ], "source": [ "timestamp(1, 95, 22)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "今回の引数チェックの場合、`hour`, `minute`, `second`のそれぞれに対し、別の例外クラスを定義するのも一案である。" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "class TimestampError(Exception):\n", " pass\n", "\n", "class TimestampHourError(TimestampError):\n", " pass\n", "\n", "class TimestampMinuteError(TimestampError):\n", " pass\n", "\n", "class TimestampSecondError(TimestampError):\n", " pass\n", "\n", "def timestamp(hour, minute, second):\n", " if hour < 0 or 24 <= hour:\n", " raise TimestampHourError(\"引数hourは0 <= hour < 24を満たす必要があります\")\n", " if minute < 0 or 60 <= minute:\n", " raise TimestampMinuteError(\"引数minuteは0 <= minute < 60を満たす必要があります\")\n", " if second < 0 or 60 <= second:\n", " raise TimestampSecondError(\"引数secondは0 <= second < 60を満たす必要があります\")\n", " return hour * 3600 + minute * 60 + second" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "例外: 引数minuteは0 <= minute < 60を満たす必要があります\n" ] } ], "source": [ "try:\n", " timestamp(2, 68, 0)\n", "except Exception as e:\n", " print('例外:', type(e), e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "なお、デバッグ目的であれば[assert](https://docs.python.org/ja/3/reference/simple_stmts.html#the-assert-statement)文を使い、引数の値をチェック(テスト)して、違反していたら[AssertionError](https://docs.python.org/ja/3/library/exceptions.html#AssertionError)を送出することもできる。" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def timestamp(hour, minute, second):\n", " assert 0 <= hour < 24, \"引数hourは0 <= hour < 24を満たす必要があります\"\n", " assert 0 <= minute < 60, \"引数minuteは0 <= minute < 60を満たす必要があります\"\n", " assert 0 <= second < 60, \"引数secondは0 <= second < 60を満たす必要があります\"\n", " return hour * 3600 + minute * 60 + second" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "AssertionError", "evalue": "引数secondは0 <= second < 60を満たす必要があります", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/3015373880.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtimestamp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m43\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m70\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/tmp/ipykernel_2793/3965020354.py\u001b[0m in \u001b[0;36mtimestamp\u001b[0;34m(hour, minute, second)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mhour\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m24\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"引数hourは0 <= hour < 24を満たす必要があります\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mminute\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m60\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"引数minuteは0 <= minute < 60を満たす必要があります\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0msecond\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m60\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"引数secondは0 <= second < 60を満たす必要があります\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mhour\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m3600\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mminute\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m60\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0msecond\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAssertionError\u001b[0m: 引数secondは0 <= second < 60を満たす必要があります" ] } ], "source": [ "timestamp(2, 43, 70)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## よく見かける例外" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "文法エラー" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (3671002116.py, line 1)", "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_2793/3671002116.py\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 2 / / 1\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "2 / / 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "インデントの間違い" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "IndentationError", "evalue": "expected an indented block (2214768420.py, line 3)", "output_type": "error", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_2793/2214768420.py\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print('even')\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n" ] } ], "source": [ "for i in range(10):\n", " if i % 2 == 0:\n", " print('even')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "オーバーフロー" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "OverflowError", "evalue": "(34, 'Numerical result out of range')", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mOverflowError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/997473611.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m2.\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0;36m1024\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mOverflowError\u001b[0m: (34, 'Numerical result out of range')" ] } ], "source": [ "2. ** 1024" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "未定義の変数" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "NameError", "evalue": "name 'a' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/188921875.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" ] } ], "source": [ "a * 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "範囲外のインデックス" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "IndexError", "evalue": "list index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/3042274859.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ "x = [1, 2, 3]\n", "x[4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "キーが見つからない" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "KeyError", "evalue": "'four'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/1027427460.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'one'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'two'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'three'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'four'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 'four'" ] } ], "source": [ "y = {'one': 1, 'two': 2, 'three': 3}\n", "y['four']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "型の不整合" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "TypeError", "evalue": "can only concatenate list (not \"dict\") to list", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/978381659.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: can only concatenate list (not \"dict\") to list" ] } ], "source": [ "x + y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ファイルが見つからない" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'hoge.txt'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_2793/1539795522.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'hoge.txt'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'hoge.txt'" ] } ], "source": [ "open('hoge.txt')" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "---\n", "\n", "[Python早見帳](https://chokkan.github.io/python/) © Copyright 2020-2022 by [岡崎 直観 (Naoaki Okazaki)](https://www.chokkan.org/). この作品はクリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンスの下に提供されています。\"クリエイティブ・コモンズ・ライセンス\"" ] } ], "metadata": { "@context": { "CreativeWork": "http://schema.org/CreativeWork", "Organization": "http://schema.org/Organization", "Person": "http://schema.org/Person", "author": "http://schema.org/author", "copyrightHolder": "http://schema.org/copyrightHolder", "copyrightYear": "http://schema.org/copyrightYear", "license": "http://schema.org/license", "name": "http://schema.org/name", "title": "http://schema.org/name", "url": "http://schema.org/url" }, "@type": "CreativeWork", "author": [ { "@type": "Person", "name": "Naoaki Okazaki", "url": "https://www.chokkan.org/" } ], "copyrightHolder": [ { "@type": "Person", "name": "Naoaki Okazaki", "url": "https://www.chokkan.org/" } ], "copyrightYear": 2022, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.10" }, "license": "https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja", "title": "Python早見帳" }, "nbformat": 4, "nbformat_minor": 4 }