Обработка ошибок для нескольких модулей в Python - PullRequest
0 голосов
/ 20 марта 2019

У меня есть проект, который имеет несколько различных модулей.

project/
    read_email.py
    browse.py
    vsw.py
    mdf.py
    cill.py
    utils_funcs.py

Итак, read_email.py читает электронное письмо и затем вызывает vsw.py

import win32com.client
from vsw import vsw
def read_email():

    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    pc_fold_struct = os.environ['USERPROFILE'] + '\\Documents\\project\\'
    inbox = outlook.GetDefaultFolder(6)

    messages = inbox.Items

    for message in messages:
        if message.Unread:
            vsw(pc_fold_struct)

В vsw Я вызываюдругие функции из остальных модулей.

из utils_funcs import click_item из mdf import mdf из обзора import обзор из импорта импорта cill import os def run_other_processes_ while_vsw (pc_fold_struct):

cill_folder = pc_fold_struct + "Cill_Status\\"
if len(os.listdir(cill_folder)) == 0:
    cill()
    click_item(1, 1, "vsw_test_blue")
if len(os.listdir(pc_fold_struct + "MDF")) == 0:
    mdf()
    click_item(1, 1, "check_vsw")
if len(os.listdir(pc_fold_struct + 'browse')) == 0:
    browse()
    click_item(1, 1, "check_vsw")

def vsw(pc_fold_struct):

    #if the loop for click item is longer than 20 counts, break and go back to read email
    click_item(1, 1, "my_fav")
    click_item(1, 1, "vsw_test")   
    run_other_processes_while_vsw(pc_fold_struct) 

Ниже приведена небольшая часть моей mdf функции

 from utils_funcs import click_item
#mdf
 def mdf():
    #also here how to make it go back to read_email if `click_item` count is 20
    click_item(1, 1, "my_fav")
    click_item(1, 1, "mdf")
    #other code occurs here.

за исключением utils_funcs.py.Этот модуль уникален тем, что у меня есть функция click_item (ниже)

def click_item(time_one, time_two, img, **kwargs):

    dir_name = 'c:\\'
    coords = None
    while coords == None:
        try:
            time.sleep(time_one)
            coords = pyautogui.locateCenterOnScreen(dir_name + "img\\" + img + ".png", grayscale=False)
            pyautogui.moveTo(x=coords.x, y=coords.y)
            pyautogui.click()
            time.sleep(time_two)
        except Exception as e:
            coords = None

, которая использует pyautogui, чтобы щелкнуть изображение.Но я использовал эту функцию во всех других моих модулях.Так как это непрерывный цикл, если он застрял в ошибке, я хочу, чтобы он разорвал цикл, например, когда число больше 20, а затем вернулся к модулю read_email.py.Единственный способ, которым я мог бы подумать - это вернуть что-то из цикла и пройти через каждый модуль, проверяя, является ли это этой переменной, если она выходит из программы.Так, например, моя функция стала бы:

def click_item(time_one, time_two, img, **kwargs):

    dir_name = 'c:\\'
    coords = None
    count = 1
    while coords == None:
        try:
            time.sleep(time_one)
            coords = pyautogui.locateCenterOnScreen(dir_name + "img\\" + img + ".png", grayscale=False)
            pyautogui.moveTo(x=coords.x, y=coords.y)
            pyautogui.click()
            time.sleep(time_two)
        except Exception as e:
            if count == 20:
                return True
            else:
                count += 1
                coords = None

Но не уверен, как обработать это в других модулях, чтобы позволить ему вернуться к read_email.py

Причина, по которой я не простопусть процесс прерывается, потому что программа, которую я автоматизирую с помощью pyautogui, иногда загружает изображение.Именно поэтому функция click_item установлена ​​на except I, установленном coords=None, однако, если она не нашла изображение после 20 раз.Тогда это ошибка, и мне нужно вернуться обратно, чтобы прочитать электронную почту.

...