🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

2回答

3357閲覧

Pythonで作るプログラムの実行結果について、正常終了と異常終了を検知できるようにしたい(sys.exitの採用で実行時エラーになる)

saya24

総合スコア246

Python

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

0グッド

0クリップ

投稿2021/02/10 04:49

編集2021/02/10 05:54

メール配信機能を経験浅いですが作ってみました。開発環境はVisualStudio2017 Professinalです。
(当該プロジェクトのプロパティで、Windowsアプリケーションのチェックが外れている、デバッグ実行するとコンソール画面起動される)

以下が現行のコードの抜粋で、デバッグ実行するとメールは配信されるものの 【ハンドルされていない例外】という実行時エラーを招きます。
イメージ説明

Python

1 smtp = smtplib.SMTP(self.mlsrv, self.mlsrv_port) 2 smtp.login(self.mlsrv_id, self.mlsrv_pw) 3 4 result = smtp.sendmail(self.mlsrv_fraddress, sendToList, msg.as_string()) 5 6 7 except Exception as e: 8 print(e.args) 9 result = True 10 finally: 11 return result 12 13''' 14############################################### 15# # 16############################################### 17''' 18mail = email() 19result = mail.send_Mail("宛先", "CC", "BCC", "タイトル", "本文", "添付ファイルのフルパス") 20if not (result): #正常処理は何も返らずFalseになる 21 sys.exit(0) 22else: 23 sys.exit(9) 24 print("異常終了")

こちらを参考に、実行結果を得られるように起動を果たそうとしています。

正常終了したのか、異常終了になったのかだけ判断できればよく、sys.exitの関数を貼り付てみたわけですがエラーになってしまいます。
###import sys は 頭に挿入されています。

初歩的なことだとは 思うのですが よく原因が分かりません。何が問題か どなたか教えて頂けませんでしょうか?

==追記 2021/02/10 14:53====================================================

例外設定が完全でなくPythonをコーディングするための設定が整っていない気が...

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

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

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

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

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

guest

回答2

0

VS使っていないので外しているかもしれませんが、以下の記事を見つけました。

https://github.com/microsoft/PTVS/pull/5397

VS 2017でsys.exit(0)でブレークするっていうことで、同じ症状に見えます。
バグのような動きであるということなので、そういうものだと思って使っていてもいいかもしれません。 ちゃんとsys.exit(0)は動作していますので。

また、そこから辿れる情報をみると、
https://github.com/microsoft/ptvsd/blob/59ef76317bd8a8c4b0a3b50b5fe21a605eb3c8b0/src/ptvsd/wrapper.py#L372

'BreakOnSystemExitZero': 'BREAK_SYSTEMEXIT_ZERO=True'

このオプションをFalseにすればいいのかもしれません。 試してませんけど。

投稿2021/02/10 06:52

TakaiY

総合スコア13765

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

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

saya24

2021/02/10 07:28

これっぽいですね、ありがとうございます。もうちょっと確認を続けます。
saya24

2021/02/10 09:40

VisualStudio上で 何をすれば良いかわからないです。どなたかお分かりの方 助けて頂けませんか
guest

0

if not (result): #正常処理は何も返らずにFalseになる、というのがはまちがいです。

smtplib.SMTP.sendmailは、正常送信できたときには辞書オブジェクトを返します。
送信先の全員に送ることができた場合には空辞書、数人に送れなかった場合は、それぞれの送信先の情報を持つ辞書を返します。

正常に送信できた場合、saya24さんのコードだと、sys.exit(9)にいき、pythonを異常終了させています。

以下のように修正すれば良いと思います。

python

1mail = email() 2result = mail.send_Mail("宛先", "CC", "BCC", "タイトル", "本文", "添付ファイルのフルパス") 3if type(result) == dict: 4 sys.exit(0) 5else: 6 sys.exit(9) 7 print("異常終了")

投稿2021/02/10 06:49

ppaul

総合スコア24670

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

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

saya24

2021/02/10 07:33

ご見解ありがとうございます。今後のコーディングにご見解を活かしてまいります。 (例外エラーは 送信できる・できないに関わらず 生じています)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問