python中多个模块的错误处理

时间:2019-03-20 17:43:03

标签: python error-handling python-module

我有一个包含多个不同模块的项目。

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导入click_item 从mdf导入mdf 从浏览导入浏览 从药丸进口药 导入操作系统 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的{​​{1}}函数中设置了except,但是20倍后仍未找到图像。这是一个错误,我需要还原为阅读电子邮件。

0 个答案:

没有答案