我有一个函数,其中包含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”
答案 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