[{"data":1,"prerenderedAt":1478},["ShallowReactive",2],{"content-\u002Fcontents\u002Ftry_exept":3,"surroundPost-\u002Fcontents\u002Ftry_exept":1469},{"id":4,"title":5,"body":6,"createdAt":1456,"description":1457,"draft":1458,"extension":1459,"meta":1460,"navigation":86,"path":1461,"seo":1462,"stem":1463,"tags":1464,"thumbnail":1467,"updatedAt":1456,"__hash__":1468},"contents\u002Fcontents\u002Ftry_exept.md","Pythonのエラーハンドリング：try...exceptのベストプラクティスを考える",{"type":7,"value":8,"toc":1438},"minimark",[9,13,21,27,44,49,55,58,94,97,300,307,310,344,351,362,365,374,379,382,385,400,403,493,497,500,502,517,519,609,613,616,618,627,629,719,723,730,742,771,775,778,784,846,849,952,956,965,987,990,993,996,1002,1010,1019,1077,1080,1089,1096,1103,1171,1174,1188,1191,1209,1215,1218,1221,1374,1380,1410,1413,1416,1419,1434],[10,11,12],"p",{},"2022 年一発目の技術記事です。",[10,14,15,16,20],{},"内容は Python の ",[17,18,19],"code",{},"try...except","、例外処理に関してです。",[10,22,23,24,26],{},"これまで ",[17,25,19],{},"をなんとなくで使っていましたが、どうあるべきかを考えて自分なりのまとめとしたいと思います。\n例外処理がしっかりかけるとアプリケーションの挙動をコントロールするのに役立ちします。そして単体テストも書きやすくなります。（これは個人の感想）",[10,28,29,30,37,38,43],{},"参考文献は、日本語だと",[31,32,36],"a",{"href":33,"rel":34},"https:\u002F\u002Famzn.to\u002F3pDVn2f",[35],"nofollow","自走プログラマー","が前回に引き続きとても参考になります。\n英語だと",[31,39,42],{"href":40,"rel":41},"https:\u002F\u002Fgoogle.github.io\u002Fstyleguide\u002Fpyguide.html",[35],"Google Python Style Guide","がめちゃめちゃいいです。",[45,46,48],"h2",{"id":47},"python-の-tryexcept-の使い方","Python の try...except の使い方",[10,50,51,52,54],{},"そもそも",[17,53,19],{},"とは通常の処理以外のケースが発生しうる状況で、その異常ケースをコントロールしたい場合に使用します。",[10,56,57],{},"ゼロ除算を例にしてみてみます。以下がゼロ除算を行うコードです。",[59,60,65],"pre",{"className":61,"code":62,"language":63,"meta":64,"style":64},"language-py shiki shiki-themes github-dark","def calc_devision(x:int):\n    return 100\u002Fx\n\ncalc_devision(0)\n","py","",[17,66,67,75,81,88],{"__ignoreMap":64},[68,69,72],"span",{"class":70,"line":71},"line",1,[68,73,74],{},"def calc_devision(x:int):\n",[68,76,78],{"class":70,"line":77},2,[68,79,80],{},"    return 100\u002Fx\n",[68,82,84],{"class":70,"line":83},3,[68,85,87],{"emptyLinePlaceholder":86},true,"\n",[68,89,91],{"class":70,"line":90},4,[68,92,93],{},"calc_devision(0)\n",[10,95,96],{},"このコードを実行すると以下のような例外が発生します。",[59,98,102],{"className":99,"code":100,"language":101,"meta":64,"style":64},"language-bash shiki shiki-themes github-dark","---------------------------------------------------------------------------\ntitle: Pythonのエラーハンドリング：try...exceptのベストプラクティスを考える\ncreatedAt: '2022-01-10'\nupdatedAt: '2022-01-10'\ntags: ['PYTHON', '2022']\ndraft: false\ndescription:  'Pythonの例外処理についてまとめてみた'\nthumbnail: '\u002Fimg\u002Ftwitter-card.png'\n---\n# Pythonのエラーハンドリング：try...exceptのベストプラクティスを考える\n-> 3 calc_devision(0)\n\n\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F2625511820.py in calc_devision(x)\n      1 def calc_devision(x:int):\n----> 2     return 100\u002Fx\n\nZeroDivisionError: division by zero\n","bash",[17,103,104,110,119,127,134,153,163,172,181,187,194,218,223,241,263,280,285],{"__ignoreMap":64},[68,105,106],{"class":70,"line":71},[68,107,109],{"class":108},"svObZ","---------------------------------------------------------------------------\n",[68,111,112,115],{"class":70,"line":77},[68,113,114],{"class":108},"title:",[68,116,118],{"class":117},"sU2Wk"," Pythonのエラーハンドリング：try...exceptのベストプラクティスを考える\n",[68,120,121,124],{"class":70,"line":83},[68,122,123],{"class":108},"createdAt:",[68,125,126],{"class":117}," '2022-01-10'\n",[68,128,129,132],{"class":70,"line":90},[68,130,131],{"class":108},"updatedAt:",[68,133,126],{"class":117},[68,135,137,140,144,147,150],{"class":70,"line":136},5,[68,138,139],{"class":108},"tags:",[68,141,143],{"class":142},"s95oV"," [",[68,145,146],{"class":117},"'PYTHON'",[68,148,149],{"class":142},", ",[68,151,152],{"class":117},"'2022']\n",[68,154,156,159],{"class":70,"line":155},6,[68,157,158],{"class":108},"draft:",[68,160,162],{"class":161},"sDLfK"," false\n",[68,164,166,169],{"class":70,"line":165},7,[68,167,168],{"class":108},"description:",[68,170,171],{"class":117},"  'Pythonの例外処理についてまとめてみた'\n",[68,173,175,178],{"class":70,"line":174},8,[68,176,177],{"class":108},"thumbnail:",[68,179,180],{"class":117}," '\u002Fimg\u002Ftwitter-card.png'\n",[68,182,184],{"class":70,"line":183},9,[68,185,186],{"class":108},"---\n",[68,188,190],{"class":70,"line":189},10,[68,191,193],{"class":192},"sAwPA","# Pythonのエラーハンドリング：try...exceptのベストプラクティスを考える\n",[68,195,197,200,203,206,209,212,215],{"class":70,"line":196},11,[68,198,199],{"class":108},"-",[68,201,202],{"class":142},"> ",[68,204,205],{"class":161},"3",[68,207,208],{"class":117}," calc_devision",[68,210,211],{"class":142},"(",[68,213,214],{"class":108},"0",[68,216,217],{"class":142},")\n",[68,219,221],{"class":70,"line":220},12,[68,222,87],{"emptyLinePlaceholder":86},[68,224,226,229,232,234,236,239],{"class":70,"line":225},13,[68,227,228],{"class":108},"\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F2625511820.py",[68,230,231],{"class":117}," in",[68,233,208],{"class":117},[68,235,211],{"class":142},[68,237,238],{"class":108},"x",[68,240,217],{"class":142},[68,242,244,247,250,252,254,257,260],{"class":70,"line":243},14,[68,245,246],{"class":108},"      1",[68,248,249],{"class":117}," def",[68,251,208],{"class":117},[68,253,211],{"class":142},[68,255,256],{"class":108},"x:int",[68,258,259],{"class":142},")",[68,261,262],{"class":117},":\n",[68,264,266,269,271,274,277],{"class":70,"line":265},15,[68,267,268],{"class":108},"----",[68,270,202],{"class":142},[68,272,273],{"class":161},"2",[68,275,276],{"class":117},"     return",[68,278,279],{"class":117}," 100\u002Fx\n",[68,281,283],{"class":70,"line":282},16,[68,284,87],{"emptyLinePlaceholder":86},[68,286,288,291,294,297],{"class":70,"line":287},17,[68,289,290],{"class":108},"ZeroDivisionError:",[68,292,293],{"class":117}," division",[68,295,296],{"class":117}," by",[68,298,299],{"class":117}," zero\n",[10,301,302,303,306],{},"この例外は",[17,304,305],{},"ZeroDivisionError","であり、0 を分母に割り算をすると発生する Python の組み込み例外です。",[10,308,309],{},"実際のシステムでは、予想外の入力によりシステムが停止するのは困ります。そこで、想定外の入力の場合に発生する例外をあらかじめ予測し、その際の処理を定義します。それが例外処理です。\n今回の例だと以下のように例外処理してみます。",[59,311,313],{"className":61,"code":312,"language":63,"meta":64,"style":64},"def calc_devision(x:int):\n    try:\n        result = 100\u002Fx\n        return result\n    except ZeroDivisionError as e:\n        print(e)\n",[17,314,315,319,324,329,334,339],{"__ignoreMap":64},[68,316,317],{"class":70,"line":71},[68,318,74],{},[68,320,321],{"class":70,"line":77},[68,322,323],{},"    try:\n",[68,325,326],{"class":70,"line":83},[68,327,328],{},"        result = 100\u002Fx\n",[68,330,331],{"class":70,"line":90},[68,332,333],{},"        return result\n",[68,335,336],{"class":70,"line":136},[68,337,338],{},"    except ZeroDivisionError as e:\n",[68,340,341],{"class":70,"line":155},[68,342,343],{},"        print(e)\n",[10,345,346,347,350],{},"この関数を先ほどと同様に実行すると",[17,348,349],{},"division by zero","のメッセージが表示され、エラーは表示されませんでした。",[10,352,353,354,357,358,361],{},"このように",[17,355,356],{},"try","句の中に例外が発生しうるコードを入れて",[17,359,360],{},"except","句に想定される例外と例外が発生時の処理を書きます。\nこれが基本の使い方です。",[45,363,364],{"id":364},"よく使う組み込み例外",[10,366,367,368,373],{},"比較的よく使う組み込み例外を紹介します。その他の例外は",[31,369,372],{"href":370,"rel":371},"https:\u002F\u002Fdocs.python.org\u002Fja\u002F3\u002Flibrary\u002Fexceptions.html",[35],"公式ドキュメント","を参照してください。",[375,376,378],"h3",{"id":377},"keyerror","KeyError",[10,380,381],{},"存在しない辞書のキーが参照された際に発生する",[10,383,384],{},"コード例",[59,386,388],{"className":61,"code":387,"language":63,"meta":64,"style":64},"dic = {\"a\":1, \"b\":2}\ndic[\"c\"]\n",[17,389,390,395],{"__ignoreMap":64},[68,391,392],{"class":70,"line":71},[68,393,394],{},"dic = {\"a\":1, \"b\":2}\n",[68,396,397],{"class":70,"line":77},[68,398,399],{},"dic[\"c\"]\n",[10,401,402],{},"発生する例外",[59,404,406],{"className":99,"code":405,"language":101,"meta":64,"style":64},"KeyError                                  Traceback (most recent call last)\n\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F3903306493.py in \u003Cmodule>\n      1 dic = {\"a\":1, \"b\":2}\n      2\n----> 3 dic[\"c\"]\n\nKeyError: 'c'\n",[17,407,408,429,449,465,470,481,485],{"__ignoreMap":64},[68,409,410,412,415,418,421,424,427],{"class":70,"line":71},[68,411,378],{"class":108},[68,413,414],{"class":117},"                                  Traceback",[68,416,417],{"class":142}," (most ",[68,419,420],{"class":117},"recent",[68,422,423],{"class":117}," call",[68,425,426],{"class":117}," last",[68,428,217],{"class":142},[68,430,431,434,436,440,443,446],{"class":70,"line":77},[68,432,433],{"class":108},"\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F3903306493.py",[68,435,231],{"class":117},[68,437,439],{"class":438},"snl16"," \u003C",[68,441,442],{"class":117},"modul",[68,444,445],{"class":142},"e",[68,447,448],{"class":438},">\n",[68,450,451,453,456,459,462],{"class":70,"line":83},[68,452,246],{"class":108},[68,454,455],{"class":117}," dic",[68,457,458],{"class":117}," =",[68,460,461],{"class":117}," {\"a\":1,",[68,463,464],{"class":117}," \"b\":2}\n",[68,466,467],{"class":70,"line":90},[68,468,469],{"class":108},"      2\n",[68,471,472,474,476,478],{"class":70,"line":136},[68,473,268],{"class":108},[68,475,202],{"class":142},[68,477,205],{"class":161},[68,479,480],{"class":117}," dic[\"c\"]\n",[68,482,483],{"class":70,"line":155},[68,484,87],{"emptyLinePlaceholder":86},[68,486,487,490],{"class":70,"line":165},[68,488,489],{"class":108},"KeyError:",[68,491,492],{"class":117}," 'c'\n",[375,494,496],{"id":495},"indexerror","IndexError",[10,498,499],{},"リストなどで存在しないインデックスにアクセスした場合に発生する。",[10,501,384],{},[59,503,505],{"className":61,"code":504,"language":63,"meta":64,"style":64},"test_list = [0, 1, 2]\ntest_list[3]\n",[17,506,507,512],{"__ignoreMap":64},[68,508,509],{"class":70,"line":71},[68,510,511],{},"test_list = [0, 1, 2]\n",[68,513,514],{"class":70,"line":77},[68,515,516],{},"test_list[3]\n",[10,518,402],{},[59,520,522],{"className":99,"code":521,"language":101,"meta":64,"style":64},"IndexError                                Traceback (most recent call last)\n\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F657759428.py in \u003Cmodule>\n      1 test_list = [0, 1, 2]\n----> 2 test_list[3]\n\nIndexError: list index out of range\n",[17,523,524,541,556,574,585,589],{"__ignoreMap":64},[68,525,526,528,531,533,535,537,539],{"class":70,"line":71},[68,527,496],{"class":108},[68,529,530],{"class":117},"                                Traceback",[68,532,417],{"class":142},[68,534,420],{"class":117},[68,536,423],{"class":117},[68,538,426],{"class":117},[68,540,217],{"class":142},[68,542,543,546,548,550,552,554],{"class":70,"line":77},[68,544,545],{"class":108},"\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F657759428.py",[68,547,231],{"class":117},[68,549,439],{"class":438},[68,551,442],{"class":117},[68,553,445],{"class":142},[68,555,448],{"class":438},[68,557,558,560,563,565,568,571],{"class":70,"line":83},[68,559,246],{"class":108},[68,561,562],{"class":117}," test_list",[68,564,458],{"class":117},[68,566,567],{"class":142}," [0, ",[68,569,570],{"class":117},"1,",[68,572,573],{"class":117}," 2]\n",[68,575,576,578,580,582],{"class":70,"line":90},[68,577,268],{"class":108},[68,579,202],{"class":142},[68,581,273],{"class":161},[68,583,584],{"class":117}," test_list[3]\n",[68,586,587],{"class":70,"line":136},[68,588,87],{"emptyLinePlaceholder":86},[68,590,591,594,597,600,603,606],{"class":70,"line":155},[68,592,593],{"class":108},"IndexError:",[68,595,596],{"class":117}," list",[68,598,599],{"class":117}," index",[68,601,602],{"class":117}," out",[68,604,605],{"class":117}," of",[68,607,608],{"class":117}," range\n",[375,610,612],{"id":611},"valueerror","ValueError",[10,614,615],{},"関数などに意図しない値が代入された場合に発生します。",[10,617,384],{},[59,619,621],{"className":61,"code":620,"language":63,"meta":64,"style":64},"int(\"hoge\")\n",[17,622,623],{"__ignoreMap":64},[68,624,625],{"class":70,"line":71},[68,626,620],{},[10,628,402],{},[59,630,632],{"className":99,"code":631,"language":101,"meta":64,"style":64},"ValueError                                Traceback (most recent call last)\n\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F1819705129.py in \u003Cmodule>\n----> 1 int(\"hoge\")\n\nValueError: invalid literal for int() with base 10: 'hoge'\n",[17,633,634,650,665,684,688],{"__ignoreMap":64},[68,635,636,638,640,642,644,646,648],{"class":70,"line":71},[68,637,612],{"class":108},[68,639,530],{"class":117},[68,641,417],{"class":142},[68,643,420],{"class":117},[68,645,423],{"class":117},[68,647,426],{"class":117},[68,649,217],{"class":142},[68,651,652,655,657,659,661,663],{"class":70,"line":77},[68,653,654],{"class":108},"\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F1819705129.py",[68,656,231],{"class":117},[68,658,439],{"class":438},[68,660,442],{"class":117},[68,662,445],{"class":142},[68,664,448],{"class":438},[68,666,667,669,671,674,677,679,682],{"class":70,"line":83},[68,668,268],{"class":108},[68,670,202],{"class":142},[68,672,673],{"class":161},"1",[68,675,676],{"class":117}," int",[68,678,211],{"class":142},[68,680,681],{"class":108},"\"hoge\"",[68,683,217],{"class":142},[68,685,686],{"class":70,"line":90},[68,687,87],{"emptyLinePlaceholder":86},[68,689,690,693,696,699,702,704,707,710,713,716],{"class":70,"line":136},[68,691,692],{"class":108},"ValueError:",[68,694,695],{"class":117}," invalid",[68,697,698],{"class":117}," literal",[68,700,701],{"class":117}," for",[68,703,676],{"class":117},[68,705,706],{"class":142},"() ",[68,708,709],{"class":117},"with",[68,711,712],{"class":117}," base",[68,714,715],{"class":117}," 10:",[68,717,718],{"class":117}," 'hoge'\n",[45,720,722],{"id":721},"例外を意図的に発生させる-raise","例外を意図的に発生させる raise",[10,724,725,726,729],{},"Python の例外は発生しないが、システム的に異常として扱いたい場合があります。\nそういった場合には例外を意図的に発生させることもできます。\n例外を意図的に発生させるには",[17,727,728],{},"raise","を使います。",[10,731,732,734,735,737,738,741],{},[17,733,728],{},"は以下のように",[17,736,728],{},"の後に",[17,739,740],{},"Exception","クラス（Exception クラスを継承した例外クラス）を書いて使います。",[59,743,745],{"className":61,"code":744,"language":63,"meta":64,"style":64},"value = -1\n\nif value \u003C 0:\n    msg = \"入力値は0以上である必要があります\"\n    raise ValueError(msg)\n",[17,746,747,752,756,761,766],{"__ignoreMap":64},[68,748,749],{"class":70,"line":71},[68,750,751],{},"value = -1\n",[68,753,754],{"class":70,"line":77},[68,755,87],{"emptyLinePlaceholder":86},[68,757,758],{"class":70,"line":83},[68,759,760],{},"if value \u003C 0:\n",[68,762,763],{"class":70,"line":90},[68,764,765],{},"    msg = \"入力値は0以上である必要があります\"\n",[68,767,768],{"class":70,"line":136},[68,769,770],{},"    raise ValueError(msg)\n",[45,772,774],{"id":773},"独自の-exception-を使う","独自の Exception を使う",[10,776,777],{},"例外を発生させたいが、組み込み例外に処理にマッチする例外がない場合があります。\nそういった場合は自作の例外クラスを作成します。",[10,779,780,781,783],{},"自作例外クラスを作るのは簡単で、",[17,782,740],{},"クラスを継承したクラスを作れば完了です。",[59,785,787],{"className":61,"code":786,"language":63,"meta":64,"style":64},"class ValidationError(Exception):\n    \"\"\"バリデーションエラー用の自作例外\n\n    Args:\n        Exception ([type]): [description]\n    \"\"\"\n\nvalue = 3\n\nif value%2 != 0:\n    msg = \"入力が奇数です\"\n    raise ValidationError(msg)\n",[17,788,789,794,799,803,808,813,818,822,827,831,836,841],{"__ignoreMap":64},[68,790,791],{"class":70,"line":71},[68,792,793],{},"class ValidationError(Exception):\n",[68,795,796],{"class":70,"line":77},[68,797,798],{},"    \"\"\"バリデーションエラー用の自作例外\n",[68,800,801],{"class":70,"line":83},[68,802,87],{"emptyLinePlaceholder":86},[68,804,805],{"class":70,"line":90},[68,806,807],{},"    Args:\n",[68,809,810],{"class":70,"line":136},[68,811,812],{},"        Exception ([type]): [description]\n",[68,814,815],{"class":70,"line":155},[68,816,817],{},"    \"\"\"\n",[68,819,820],{"class":70,"line":165},[68,821,87],{"emptyLinePlaceholder":86},[68,823,824],{"class":70,"line":174},[68,825,826],{},"value = 3\n",[68,828,829],{"class":70,"line":183},[68,830,87],{"emptyLinePlaceholder":86},[68,832,833],{"class":70,"line":189},[68,834,835],{},"if value%2 != 0:\n",[68,837,838],{"class":70,"line":196},[68,839,840],{},"    msg = \"入力が奇数です\"\n",[68,842,843],{"class":70,"line":220},[68,844,845],{},"    raise ValidationError(msg)\n",[10,847,848],{},"上記コードを実行すると以下のような例外が発生します。",[59,850,852],{"className":99,"code":851,"language":101,"meta":64,"style":64},"ValidationError                           Traceback (most recent call last)\n\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F3159419445.py in \u003Cmodule>\n     11 if value%2 != 0:\n     12     msg = \"入力が奇数です\"\n---> 13     raise ValidationError(msg)\n\nValidationError: 入力が奇数です\n",[17,853,854,872,887,904,917,940,944],{"__ignoreMap":64},[68,855,856,859,862,864,866,868,870],{"class":70,"line":71},[68,857,858],{"class":108},"ValidationError",[68,860,861],{"class":117},"                           Traceback",[68,863,417],{"class":142},[68,865,420],{"class":117},[68,867,423],{"class":117},[68,869,426],{"class":117},[68,871,217],{"class":142},[68,873,874,877,879,881,883,885],{"class":70,"line":77},[68,875,876],{"class":108},"\u002Fvar\u002Ffolders\u002F8r\u002Ftgv96pk10zs6c5dlqdz80dyr0000gn\u002FT\u002Fipykernel_80515\u002F3159419445.py",[68,878,231],{"class":117},[68,880,439],{"class":438},[68,882,442],{"class":117},[68,884,445],{"class":142},[68,886,448],{"class":438},[68,888,889,892,895,898,901],{"class":70,"line":83},[68,890,891],{"class":108},"     11",[68,893,894],{"class":117}," if",[68,896,897],{"class":117}," value%2",[68,899,900],{"class":117}," !=",[68,902,903],{"class":117}," 0:\n",[68,905,906,909,912,914],{"class":70,"line":90},[68,907,908],{"class":108},"     12",[68,910,911],{"class":117},"     msg",[68,913,458],{"class":117},[68,915,916],{"class":117}," \"入力が奇数です\"\n",[68,918,919,922,924,927,930,933,935,938],{"class":70,"line":136},[68,920,921],{"class":108},"---",[68,923,202],{"class":142},[68,925,926],{"class":161},"13",[68,928,929],{"class":117},"     raise",[68,931,932],{"class":117}," ValidationError",[68,934,211],{"class":142},[68,936,937],{"class":108},"msg",[68,939,217],{"class":142},[68,941,942],{"class":70,"line":155},[68,943,87],{"emptyLinePlaceholder":86},[68,945,946,949],{"class":70,"line":165},[68,947,948],{"class":108},"ValidationError:",[68,950,951],{"class":117}," 入力が奇数です\n",[45,953,955],{"id":954},"python-の-tryexcept-のベストプラクティスとは","Python の try...except のベストプラクティスとは？",[10,957,958,961,962,964],{},[31,959,42],{"href":40,"rel":960},[35],"に記載されている",[17,963,740],{},"の項に関して重要だと思うものを書きました。",[966,967,968,972,981],"ol",{},[969,970,971],"li",{},"例外を発生させる場合、まずは組み込み例外が使えないか検討する",[969,973,974,975,977,978,980],{},"基本的に",[17,976,740],{},"で",[17,979,360],{},"しない",[969,982,983,986],{},[17,984,985],{},"try\u002Fexcept","で囲むコードは最小限にする",[10,988,989],{},"実務で大事だと感じるのは 2 と 3 です。特に 3 は意識したほうがいいです。そして 3 を守れなくなると、複数の例外が try の処理中に入りうるのでどうしても 2 が守れなくなりがちです。",[10,991,992],{},"上記以外によく言われるのは、基本的に例外は想定外の入力があった場合、素直に発生するようにします。要はエラーを握りつぶさないようにするということです。",[45,994,995],{"id":995},"その他細かいこと",[375,997,999,1001],{"id":998},"tryexcept関連の書き方",[17,1000,19],{},"関連の書き方。",[966,1003,1004],{},[969,1005,1006,1009],{},[17,1007,1008],{},"else","句の利用",[10,1011,1012,1013,1015,1016,1018],{},"以下のように",[17,1014,19],{},"と同じ階層に",[17,1017,1008],{},"を書くと例外が発生しなかった場合の処理を書ける。",[59,1020,1022],{"className":61,"code":1021,"language":63,"meta":64,"style":64},"def calc_devision(x:int):\n    result = 0\n    try:\n        result = 100\u002Fx\n    except ZeroDivisionError as e:\n        print(e)\n    else:\n        print(\"例外なし\")\n\nval = 1\n\ncalc_devision(val)\n",[17,1023,1024,1028,1033,1037,1041,1045,1049,1054,1059,1063,1068,1072],{"__ignoreMap":64},[68,1025,1026],{"class":70,"line":71},[68,1027,74],{},[68,1029,1030],{"class":70,"line":77},[68,1031,1032],{},"    result = 0\n",[68,1034,1035],{"class":70,"line":83},[68,1036,323],{},[68,1038,1039],{"class":70,"line":90},[68,1040,328],{},[68,1042,1043],{"class":70,"line":136},[68,1044,338],{},[68,1046,1047],{"class":70,"line":155},[68,1048,343],{},[68,1050,1051],{"class":70,"line":165},[68,1052,1053],{},"    else:\n",[68,1055,1056],{"class":70,"line":174},[68,1057,1058],{},"        print(\"例外なし\")\n",[68,1060,1061],{"class":70,"line":183},[68,1062,87],{"emptyLinePlaceholder":86},[68,1064,1065],{"class":70,"line":189},[68,1066,1067],{},"val = 1\n",[68,1069,1070],{"class":70,"line":196},[68,1071,87],{"emptyLinePlaceholder":86},[68,1073,1074],{"class":70,"line":220},[68,1075,1076],{},"calc_devision(val)\n",[10,1078,1079],{},"結果は以下のようになる。",[59,1081,1083],{"className":99,"code":1082,"language":101,"meta":64,"style":64},"例外なし\n",[17,1084,1085],{"__ignoreMap":64},[68,1086,1087],{"class":70,"line":71},[68,1088,1082],{"class":108},[966,1090,1091],{"start":77},[969,1092,1093,1009],{},[17,1094,1095],{},"finaly",[10,1097,1012,1098,1015,1100,1102],{},[17,1099,19],{},[17,1101,1095],{},"を書くと例外が発生してもしなくても実行される処理を書ける。",[59,1104,1106],{"className":61,"code":1105,"language":63,"meta":64,"style":64},"def calc_devision(x:int):\n    result = 0\n    try:\n        result = 100\u002Fx\n    except ZeroDivisionError as e:\n        print(e)\n    else:\n        print(\"例外なし\")\n    finally:\n        print(\"終了\")\n    return result\n\nval = 1\n\ncalc_devision(val)\n",[17,1107,1108,1112,1116,1120,1124,1128,1132,1136,1140,1145,1150,1155,1159,1163,1167],{"__ignoreMap":64},[68,1109,1110],{"class":70,"line":71},[68,1111,74],{},[68,1113,1114],{"class":70,"line":77},[68,1115,1032],{},[68,1117,1118],{"class":70,"line":83},[68,1119,323],{},[68,1121,1122],{"class":70,"line":90},[68,1123,328],{},[68,1125,1126],{"class":70,"line":136},[68,1127,338],{},[68,1129,1130],{"class":70,"line":155},[68,1131,343],{},[68,1133,1134],{"class":70,"line":165},[68,1135,1053],{},[68,1137,1138],{"class":70,"line":174},[68,1139,1058],{},[68,1141,1142],{"class":70,"line":183},[68,1143,1144],{},"    finally:\n",[68,1146,1147],{"class":70,"line":189},[68,1148,1149],{},"        print(\"終了\")\n",[68,1151,1152],{"class":70,"line":196},[68,1153,1154],{},"    return result\n",[68,1156,1157],{"class":70,"line":220},[68,1158,87],{"emptyLinePlaceholder":86},[68,1160,1161],{"class":70,"line":225},[68,1162,1067],{},[68,1164,1165],{"class":70,"line":243},[68,1166,87],{"emptyLinePlaceholder":86},[68,1168,1169],{"class":70,"line":265},[68,1170,1076],{},[10,1172,1173],{},"実行結果は以下のようになる。",[59,1175,1177],{"className":99,"code":1176,"language":101,"meta":64,"style":64},"例外なし\n終了\n",[17,1178,1179,1183],{"__ignoreMap":64},[68,1180,1181],{"class":70,"line":71},[68,1182,1082],{"class":108},[68,1184,1185],{"class":70,"line":77},[68,1186,1187],{"class":108},"終了\n",[10,1189,1190],{},"例外を発生させた場合は以下の出力になる。",[59,1192,1194],{"className":99,"code":1193,"language":101,"meta":64,"style":64},"division by zero\n終了\n",[17,1195,1196,1205],{"__ignoreMap":64},[68,1197,1198,1201,1203],{"class":70,"line":71},[68,1199,1200],{"class":108},"division",[68,1202,296],{"class":117},[68,1204,299],{"class":117},[68,1206,1207],{"class":70,"line":77},[68,1208,1187],{"class":108},[10,1210,1211,1212,1214],{},"いずれにせよ",[17,1213,1095],{},"句の処理が実行されていることがわかる。",[375,1216,1217],{"id":1217},"例外はまとめて書ける",[10,1219,1220],{},"例えば以下のような自作例外クラスを作ったとします。",[59,1222,1224],{"className":61,"code":1223,"language":63,"meta":64,"style":64},"class MyAppError(Exception):\n    \"\"\"テスト用例外\n\n    Args:\n        Exception ([type]): [description]\n    \"\"\"\n\nclass UserNotFoundError(MyAppError):\n    \"\"\"プロジェクトが見つからなかった場合のエラー\n\n    Args:\n        MyAppError ([type]): [description]\n    \"\"\"\n\nclass ValidationError(MyAppError):\n    \"\"\"入力エラー\n\n    Args:\n        MyAppError ([type]): [description]\n    \"\"\"\n\ndef search_user(name:str):\n    name_list = []\n    if name not in name_list:\n        raise UserNotFoundError(\"ユーザが見つかりません\")\n\ndef change_name(name:str):\n    name_length = len(name)\n    if name_length > 10:\n        raise ValidationError(\"ユーザ名は10文字以内にしてください\")\n",[17,1225,1226,1231,1236,1240,1244,1248,1252,1256,1261,1266,1270,1274,1279,1283,1287,1292,1297,1301,1306,1311,1316,1321,1327,1333,1339,1345,1350,1356,1362,1368],{"__ignoreMap":64},[68,1227,1228],{"class":70,"line":71},[68,1229,1230],{},"class MyAppError(Exception):\n",[68,1232,1233],{"class":70,"line":77},[68,1234,1235],{},"    \"\"\"テスト用例外\n",[68,1237,1238],{"class":70,"line":83},[68,1239,87],{"emptyLinePlaceholder":86},[68,1241,1242],{"class":70,"line":90},[68,1243,807],{},[68,1245,1246],{"class":70,"line":136},[68,1247,812],{},[68,1249,1250],{"class":70,"line":155},[68,1251,817],{},[68,1253,1254],{"class":70,"line":165},[68,1255,87],{"emptyLinePlaceholder":86},[68,1257,1258],{"class":70,"line":174},[68,1259,1260],{},"class UserNotFoundError(MyAppError):\n",[68,1262,1263],{"class":70,"line":183},[68,1264,1265],{},"    \"\"\"プロジェクトが見つからなかった場合のエラー\n",[68,1267,1268],{"class":70,"line":189},[68,1269,87],{"emptyLinePlaceholder":86},[68,1271,1272],{"class":70,"line":196},[68,1273,807],{},[68,1275,1276],{"class":70,"line":220},[68,1277,1278],{},"        MyAppError ([type]): [description]\n",[68,1280,1281],{"class":70,"line":225},[68,1282,817],{},[68,1284,1285],{"class":70,"line":243},[68,1286,87],{"emptyLinePlaceholder":86},[68,1288,1289],{"class":70,"line":265},[68,1290,1291],{},"class ValidationError(MyAppError):\n",[68,1293,1294],{"class":70,"line":282},[68,1295,1296],{},"    \"\"\"入力エラー\n",[68,1298,1299],{"class":70,"line":287},[68,1300,87],{"emptyLinePlaceholder":86},[68,1302,1304],{"class":70,"line":1303},18,[68,1305,807],{},[68,1307,1309],{"class":70,"line":1308},19,[68,1310,1278],{},[68,1312,1314],{"class":70,"line":1313},20,[68,1315,817],{},[68,1317,1319],{"class":70,"line":1318},21,[68,1320,87],{"emptyLinePlaceholder":86},[68,1322,1324],{"class":70,"line":1323},22,[68,1325,1326],{},"def search_user(name:str):\n",[68,1328,1330],{"class":70,"line":1329},23,[68,1331,1332],{},"    name_list = []\n",[68,1334,1336],{"class":70,"line":1335},24,[68,1337,1338],{},"    if name not in name_list:\n",[68,1340,1342],{"class":70,"line":1341},25,[68,1343,1344],{},"        raise UserNotFoundError(\"ユーザが見つかりません\")\n",[68,1346,1348],{"class":70,"line":1347},26,[68,1349,87],{"emptyLinePlaceholder":86},[68,1351,1353],{"class":70,"line":1352},27,[68,1354,1355],{},"def change_name(name:str):\n",[68,1357,1359],{"class":70,"line":1358},28,[68,1360,1361],{},"    name_length = len(name)\n",[68,1363,1365],{"class":70,"line":1364},29,[68,1366,1367],{},"    if name_length > 10:\n",[68,1369,1371],{"class":70,"line":1370},30,[68,1372,1373],{},"        raise ValidationError(\"ユーザ名は10文字以内にしてください\")\n",[10,1375,1376,1377,1379],{},"この時以下のように継承元の例外クラスを",[17,1378,360],{},"することで継承先の例外クラスもキャッチできます。",[59,1381,1383],{"className":61,"code":1382,"language":63,"meta":64,"style":64},"try:\n    #search_user(\"taro\")\n    change_name(\"tarotarotaro\")\nexcept MyAppError as e:\n    print(str(e))\n",[17,1384,1385,1390,1395,1400,1405],{"__ignoreMap":64},[68,1386,1387],{"class":70,"line":71},[68,1388,1389],{},"try:\n",[68,1391,1392],{"class":70,"line":77},[68,1393,1394],{},"    #search_user(\"taro\")\n",[68,1396,1397],{"class":70,"line":83},[68,1398,1399],{},"    change_name(\"tarotarotaro\")\n",[68,1401,1402],{"class":70,"line":90},[68,1403,1404],{},"except MyAppError as e:\n",[68,1406,1407],{"class":70,"line":136},[68,1408,1409],{},"    print(str(e))\n",[45,1411,1412],{"id":1412},"おわりに",[10,1414,1415],{},"今回は Python の例外クラスについて書きました。とりあえず知ってることを取り止めもなくまとめました。\n例外クラスはアプリケーションを作る上で扱い方をしっかり知っておく必要があるので、参考にしてもらえると嬉しいです。",[45,1417,1418],{"id":1418},"参考文献",[1420,1421,1422,1429],"ul",{},[969,1423,1424],{},[31,1425,1428],{"href":1426,"rel":1427},"https:\u002F\u002Famzn.to\u002F3CnNIIY",[35],"エキスパート Python プログラミング改訂 3 版",[969,1430,1431],{},[31,1432,36],{"href":33,"rel":1433},[35],[1435,1436,1437],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}",{"title":64,"searchDepth":77,"depth":77,"links":1439},[1440,1441,1446,1447,1448,1449,1454,1455],{"id":47,"depth":77,"text":48},{"id":364,"depth":77,"text":364,"children":1442},[1443,1444,1445],{"id":377,"depth":83,"text":378},{"id":495,"depth":83,"text":496},{"id":611,"depth":83,"text":612},{"id":721,"depth":77,"text":722},{"id":773,"depth":77,"text":774},{"id":954,"depth":77,"text":955},{"id":995,"depth":77,"text":995,"children":1450},[1451,1453],{"id":998,"depth":83,"text":1452},"try...except関連の書き方。",{"id":1217,"depth":83,"text":1217},{"id":1412,"depth":77,"text":1412},{"id":1418,"depth":77,"text":1418},"2022-01-10","Pythonの例外処理についてまとめてみた",false,"md",{},"\u002Fcontents\u002Ftry_exept",{"title":5,"description":1457},"contents\u002Ftry_exept",[1465,1466],"Python","2022","\u002Fimg\u002Ftwitter-card.png","9AfSexF5B2qFquBVai9RBBkgODY3Et4W74fOHWXdJAw",[1470,1474],{"title":1471,"path":1472,"stem":1473,"children":-1},"Beyond Similarity: Trustworthy Memory Search for Personal AI Agents","\u002Fcontents\u002Ftrustworthy-memory-search","contents\u002Ftrustworthy-memory-search",{"title":1475,"path":1476,"stem":1477,"children":-1},"AWS SAMの使い方｜ローカル開発からデプロイまで","\u002Fcontents\u002Fuse-aws-sam","contents\u002Fuse-aws-sam",1784936718428]