80507


#### やりたいこと

Pythonでメール内の処理でエラーが発生したら、特定のサイトにエラー通知を飛ばしたいです。  
下記のコードのようにtryのブロック内にエラー通知を検知したいです。

  * if でメールが無い場合: 正常終了
  * エラーがある場合: exceptに飛ばしたい

メールの有無を判定する分岐

[code]

    if not time:　
    　return d["NULL"]
    else:
       print('DL OK　メールがあるので処理続く')
    
[/code]

現状だとtryのブロック内でエラーが発生してもexceptに飛ばないです。  
定義した関数で return を利用しているからでしょうか。

[code]

    import imaplib, re, email, six, dateutil.parser
    import json
    import requests
    
    def a(d): 
     try:
      mail=imaplib.IMAP4_SSL('imap.gmail.com',993)  #SMTPは993,POPは995
      mail.login('example@co.jp','12345')
      mail.select('testlabel')  #メールボックスの選択
     
      #UNSEEN未読メールを読み込む
      type,data=mail.search(None,'UNSEEN') #メールボックス内にあるすべてのデータを取得ALL
     
      for i in data[0].split():   #data分繰り返す
       ok,x=mail.fetch(i,'RFC822')    #メールの情報を取得
       ms=email.message_from_string(x[0][1].decode('iso-2022-jp'))    #パースして取得
     
      #差出人を取得
      ad=email.header.decode_header(ms.get('From'))
      ms_code=ad[0][1]
      if(ms_code!=None):
       address=ad[0][0].decode(ms_code)
       address+=ad[1][0].decode(ms_code)
      else:
       address=ad[0][0]
     
      #タイトルを取得
      sb=email.header.decode_header(ms.get('Subject'))
      ms_code=sb[0][1]
      if(ms_code!=None):
       sbject=sb[0][0].decode(ms_code)
      else:
       ms_code=sb[1][1]
       sbject=sb[1][0].decode(ms_code)
     
      #本文を取得
      maintext=ms.get_payload()
     
      #メールの日時を取得
      time = dateutil.parser.parse(ms.get('Date')).strftime("%Y-%m-%d %H:%M")[:-1]
      print(time)
     
      #出力
      print(sbject)
      print(address)
      print(maintext)
     
     
     #Data confirm null確認
      if not time:
       return d["NULL"]
       #print('NULL')
      else:
       print('DL OK　メールがあるので処理続く')
     
      mail.close()
      mail.logout() 
     
     except :
          # エラー発生時ここにくる
          example_url ="https://wh.example.com/connect-api/webhook/12234/abcd"
          example_header ={   
             
          "Accept": "application/vnd.tosslab.example-v2+json",
          "Content-Type": "application/json"
          }
          example_payload ={
             
          "body": "Error",
          "connectColor": "#FF0000",
          "connectInfo": [{
             
          "title":"正常に実行できませんでしたので、\nご確認お願い致します。"
          }
          ]
          }
          # post to example
          requests.post(url=example_url, data=json.dumps(example_payload), headers=example_header, timeout=10)
     
     print('正常終了')
    
[/code]


CC BY-SA 4.0
2021-06-21T03:19:09.323
77673
2022-05-18T11:40:16.150
2022-05-18T11:40:16.150
3060
18859
question
python python3 exception
try ブロックでエラーが発生しても、意図した通り except に飛ばない


さらに良いことに、あなたは例外を投げることができます

[code]

      #...
      if not time:
       raise ValueError("Value null")
       #return d["NULL"]
       #print('NULL')
      else:
        #...
    
[/code]

これにより、このブロックは `except` ブロックに渡されます。


CC BY-SA 4.0
2021-07-31T19:02:32.677
80507
2021-07-31T19:02:32.677
47532
77673
answer