处理具有多个参数的函数的异常吗?

时间:2019-05-19 04:47:57

标签: python python-3.x

我有一个函数,其中包含2个必需参数和一个可选参数。 我正在尝试解决所有可能的错误/异常,并确保如果引发这些异常,则可以“正常”退出程序,例如打印出类似“无效文件名”的语句。

到目前为止,我遇到了NameError和TypeError,但是我不知道如何在不使用try和except的情况下解决这些问题。请注意,在下面的代码中,textfile1必须是一个文件,arg2可以是另一个文本文件,也可以是一个名为“ listing”的字符串。

import os
def main(textfile1, arg2, normalize = False):
    if not os.path.isfile(textfile1): 
        print("Filename is invalid.")
        return None
    if TypeError:
        print("Missing 1 or 2 arguments. Make sure to enter both     arguements.")
        return None
    if NameError:
        print("Incorrect input. Enter argument with ' ' or " "")
    if arg2 != 'listing':
        if not os.path.isfile(arg2):
            print("Second filename is invalid")
    if arg2 == 'listing':
        #do something with the file

显然,“ if”的使用是错误的。我想尝试处理如下异常: NameError:名称“插入随机名称”未定义 TypeError:main()缺少2个必需的位置参数:“ textfile1”和“ arg2” TypeError:main()缺少1个必需的位置参数:“ arg2”

2 个答案:

答案 0 :(得分:0)

如果您不想使用try / except,则可以自己进行检查,但是我建议使用异常,因为它在python中既便宜又有效,

以下示例:

import os
# make all your arguments optional 
def main(textfile1=None, arg2=None, normalize = False):
    if not os.path.isfile(textfile1): 
        print("Filename is invalid.")
        return None
    if not (textfile1 and arg2):  # case of Missing 1 or 2 arguments
        print("Missing 1 or 2 arguments. Make sure to enter both     arguements.")
        return None
    if type(textfile1) != type(arg2) != str: # case of Incorrect input type
        print("Incorrect input. Enter argument with ' ' or " "")
    if arg2 != 'listing':
        if not os.path.isfile(arg2):
            print("Second filename is invalid")
    if arg2 == 'listing':
        #do something with the file

答案 1 :(得分:0)

您似乎在尝试使用参数之前先对其进行验证。很好,但是通常这意味着引发异常,以便您的呼叫者在出现问题时能够捕获。

import os


def main(textfile1, arg2, normalize = False):
    if not os.path.isfile(textfile1): 
        raise FileNotFoundError(textfile1)
        # Or sys.exit(1) if you are sure that nobody calling you
        # can do anything sensible besides exit.

    # You won't even get this far if any required arguments
    # were omitted from the call.

    # If a NameError is raised, that means you have a bug to fix,
    # not a runtime condition to react to.

    if arg2 != 'listing':
        if not os.path.isfile(arg2):
            raise FileNotFoundError(textfile1)
    else:  # arg2 == 'listing' implied
        #do something with the file

但是,通常,您只是尝试按原样使用参数,并捕获可能发生的任何异常。如果您在捕获异常后没有任何建设性的工作,请不要一开始就捕获它。

def main(textfile1, arg2, normalize=False):

    try:
        with open(textfile1) as f:
            ...
    except FileNotFoundError:
        print(f"Could not find {textfile1} for reading", file=sys.stderr)
        return