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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

848閲覧

Python: クラスのメソッドでExceptionがCatchされた際、以降の処理を停めたい(TkInterのUIは維持して、ユーザ側に制御を戻したい)

saya24

総合スコア222

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/31 01:20

編集2020/05/31 01:23

タイトルが弱冠難しい表記となりましたが、ある処理でエラーと認識したら、以降の処理を停め ユーザ側に制御を戻したいだけです。

クラスのメソッド内で 処理を中断・ユーザ側に制御を戻すには どういう対策をとるべきなのでしょうか
自分は今回 exit() を記載したわけですが、停まるどころか 「Message=None」というエラーを招きます。

クラスの中の一つのメソッド

python

1 def send_Mail(self, toaddress, subject, body, parent): 2 try: 3 message = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s" % (self.mlsrv_fraddress, toaddress, subject, body)) 4 5 smtp = smtplib.SMTP(self.mlsrv, self.mlsrv_port) 6 smtp.login(self.mlsrv_id, self.mlsrv_pw) 7 result = smtp.sendmail(self.mlsrv_fraddress, toaddress, message) 8 except Exception as e: 9 tkmb.showerror("Abort", e, parent=parent) 10 exit() #★★★エラーになる、ユーザに制御を返すことを希望するも

クラスを生成してメソッドを利用している側

python

1def test_Send(event=None): 2 if tkmb.askyesno("Confirmation","This mail will be sent to the address you specified at the field." + "\r\n===> " + self.ts_txt5.get(), parent=self.this): 3 test = email() 4 test.testsetting(self.ts_txt1.get(), self.ts_txt2.get(), self.ts_txt3.get(), self.ts_txt4.get(), self.ts_txt5.get()) 5 6 #上記メソッドの呼出し、★失敗の場合、次のステップにいかないことを希望!!!★ 7 test.send_Mail(self.ts_txt5.get(),"+++ This mail was sent from you for a test!! +++ ", self.ts_scrtxt1.get('1.0', 'end -1c'), self.this) 8 9 #正常終了を伝えるメッセージボックス、上記が失敗したらここまで来てほしくない 10 tkmb.showinfo("Result","Finished !", parent=self.this)

クラスの全容を掲載しませんでしたが、概要は以下のとおり。
メールの送信機能をクラスとして作成しました。
予め設定しておくメールサーバから都度指定されるメールアドレス・件名・内容をメール配信することを主の役割に作成しました。
先に記述した、「予め設定しておく」が整っていない状態でも、メール系初期設定画面で テスト送信にも用いれるよう作成したつもりです。

尚、以下のようにメソッド内の根幹動作部分に 結果を変数resultに収めるようしているので この戻り値を呼び出し側で判断する方法も考えたのですが
一先ずprintで変数の内容を確認するとUnboundLocalError: local variable 'result' referenced before assignment という事象を招き
これでは使えない、と思い断念しました。(別案件掲載している全角文字を含むメールでテスト:動作結果を変数に得るまえにコけている?!)

python

1result = smtp.sendmail(self.mlsrv_fraddress, toaddress, message)

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

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

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

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

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

shiracamus

2020/05/31 02:46 編集

exit() じゃなく、return でエラーコードを返して、呼び出し元でエラー判定すればいいのでは? あるいは、再び throw Error で例外を投げて、呼び出し元に try catch させればいいのでは?
saya24

2020/05/31 02:59

ご見解をありがとうございます。いづれにせよ、呼出し元で処理を中断しては??とのご提案ですね。 インスタンスのメソッドでは制御できないことなのでしょうか? 要因を把握した上で方向転換すると、今後の作業の上で役に立つので
shiracamus

2020/05/31 03:19 編集

メソッドも単なる関数なので、呼び出し元に return で戻るか、例外を投げてcatchしてるとこに強制的に飛ばすかしか方法がありません。 exit()やquit()も内部的に例外を投げてシステムを終了させています。 参考: https://docs.python.org/ja/3/library/sys.html#sys.exit
saya24

2020/05/31 03:27

shiracamusさん ご説明ありがとうございます。戻す事が関数の役割だ、と考えれば、確かに納得できますね。Pythonに限らずかもしれませんね
guest

回答1

0

ベストアンサー

追記・修正欄に書いたけれど、回答欄にも書いておきます。
exit()result = None にして、resultNoneかどうかを調べてエラー処理すればいいと思います。

投稿2020/05/31 03:32

shiracamus

総合スコア5406

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

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

saya24

2020/05/31 03:54

この度はご親切な手ほどきをありがとうございました。 回答覧に記載頂けたことでベストアンサーを付けられます、助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問