質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

845閲覧

Python 例外処理 Errorで強制終了させたい

oono

総合スコア38

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/05/23 02:35

実現したいこと

Python 例外処理で errorを出力させても、プログラムがそこで強制終了せず、先に進んでしまうことがある。errorの出た場所で強制終了させたい。

前提

定義関数1のReturn を受けて 定義関数2を実行するプログラムで、定義関数1に例外処理をかけて、エラーが発生しているのに、そのエラーのreturn値を定義関数2が受けて実行し、そこまで進んで初めてプログラムが終了する。
実用上、上記の応答でも問題ないようにも思えるが、例外処理でErrorのあった場所でプログラムを終了させたい。

発生している問題・エラーメッセージ

例外処理してなければ、ソースコードの最初の定義関数 test_1で、 ZeroDivisionError: division by zero のエラーでプログラムが終了するのに。例外処理すると以下のように、定義関数test_2まで進んでからでないとプログラム終了しない。 runfile('C:/pyfile/tryexcept_logging2.py', wdir='C:/pyfile') 実行開始 - 2023-05-23 11:00:29,372 - ERROR_3 - ERROR - division by zero - 実行終了 Traceback (most recent call last):  File ~\Anaconda3\envs\oono_latest\lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec exec(code, globals, locals) File c:\pyfile\tryexcept_logging2.py:33 → 何でtest_2まで進んでるの??? test_2(m=f) NameError: name 'f' is not defined

該当のソースコード

Python

1import logging 2 3def test_1(k): 4 f=100/k 5 return f 6 7def test_2(m): 8 z=m 9 print(z) 10 11def logger_error(e): 12 logger=logging.getLogger("ERROR_3") 13 logger.setLevel(logging.ERROR) 14 sh=logging.StreamHandler() 15 sh.setLevel(logging.ERROR) 16 format=logging.Formatter("%(start)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s - %(end)s") 17 sh.setFormatter(format) 18 for h in logger.handlers[:]: 19 logger.removeHandler(h) 20 h.close() 21 logger.addHandler(sh) 22 d={"start":"実行開始","end":"実行終了"} 23 logger.error(e,extra=d) 24 #logger.exception(e,extra=d) #trace backも出力する 25 26k0=0 27try: 28 f=test_1(k=k0) 29except ZeroDivisionError as e: #分母が0 30 logger_error(e=e) 31 32test_2(m=f)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

プログラムの流れをちゃんと制御するのがいいと思います。

やりかたはいろいろあると思いますが、質問のコードに沿うのであれば、

python

1test1_res = True 2try: 3 f=test_1(k=k0) 4except ZeroDivisionError as e: #分母が0 5 logger_error(e=e) 6 test1_res = False 7 8if test1_res: 9 test_2(m=f)

また、ゼロ除算の例外は除算をしている関数内で処理すべきだと思うので、自分ならこうします。

python

1def test_1(k): 2 f = None 3 result = False 4 try 5 f=100/k 6 result = True 7 except ZeroDivisionError as e: #分母が0 8 logger_error(e=e) 9 return result, f 10 11test1_res, f = test_1(k=k0) 12 13if test1_res: 14 test_2(m=f)

投稿2023/05/23 02:58

TakaiY

総合スコア12651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

except節で無視するように指示しているから、という話ですか?

python

1try: 2 5 / 0 3except ZeroDivisionError: 4 print('ZeroDivisionErrorは握りつぶしたよ') 5 6print('ZeroDivisionErrorが握りつぶされたからここまでくるよ')

結果

plain

1ZeroDivisionErrorは握りつぶしたよ 2ZeroDivisionErrorが握りつぶされたからここまでくるよ

引数なしのraise文で、捕捉した例外をもとのまま送出できます。

python

1try: 2 5 / 0 3except ZeroDivisionError: 4 print('なにかログを書くとか') 5 raise 6 7print('ZeroDivisionErrorが握りつぶされたらここまでくるよ')

結果

plain

1なにかログを書くとか 2Traceback (most recent call last): 3 File "<stdin>", line 2, in <module> 4ZeroDivisionError: division by zero

別のエラーを送出しつつ、元の例外の情報も残したい時は raise X from Yです。

python

1try: 2 5 / 0 3except ZeroDivisionError as e: 4 print('なにかログを書くとか') 5 raise RuntimeError from e

結果

plain

1なにかログを書くとか 2Traceback (most recent call last): 3 File "<stdin>", line 2, in <module> 4ZeroDivisionError: division by zero 5 6The above exception was the direct cause of the following exception: 7 8Traceback (most recent call last): 9 File "<stdin>", line 5, in <module> 10RuntimeError

参考
https://docs.python.org/ja/3/reference/simple_stmts.html#the-raise-statement

投稿2023/05/23 03:01

quickquip

総合スコア11027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問