在Python中多次尝试处理一个异常的好方法是什么?
比方说,我有一个处理异常的首选解决方案。在Python中多次尝试处理一个异常的好方法是什么?,python,python-3.x,exception-handling,Python,Python 3.x,Exception Handling,比方说,我有一个处理异常的首选解决方案。 但有时仍会出现异常,我必须使用第二种不太受欢迎的解决方案。 我使用下面这样的代码,它看起来可能不酷。如果有更好的做法,请提出建议 try: print(undefined_varible) except NameError: try: print("1st attempt to handle NameError exception") except NameError: print("2nd att
但有时仍会出现异常,我必须使用第二种不太受欢迎的解决方案。
我使用下面这样的代码,它看起来可能不酷。如果有更好的做法,请提出建议
try:
print(undefined_varible)
except NameError:
try:
print("1st attempt to handle NameError exception")
except NameError:
print("2nd attempt to handle NameError exception")
更新:这是我的一段真实代码
import re
def find_phone(text):
try:
pattern = re.compile(r"(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?")
#search for a phone number
mo = pattern.search(text)
phone = mo.group()
print (phone)
except AttributeError:
try:
#don't want to use this pattern always because it's too wide and not perfect
pattern = re.compile(r"(?:\+?(\d{1,3}))?[-. (]*(\d{1,3})[-. )]*(\d{1,3})[-. ]*(\d{1,4})([-. ]*(\d{1,4}))?([-. ]*(\d{1,4}))?(?: *x(\d{1,4}))?")
mo = pattern.search(text)
phone = mo.group()
print (phone)
except AttributeError:
print("phone number has not been found")
find_phone("here is the weird formatted phone number: +33 6 29 37 24 57")
我想这就是你想要的:
import re
def find_phone(text):
pattern_preference = [
r"(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?",
r"(?:\+?(\d{1,3}))?[-. (]*(\d{1,3})[-. )]*(\d{1,3})[-. ]*(\d{1,4})([-. ]*(\d{1,4}))?([-. ]*(\d{1,4}))?(?: *x(\d{1,4}))?"
]
for pattern in pattern_preference:
try:
pattern = re.compile(pattern)
#search for a phone number
mo = pattern.search(text)
phone = mo.group()
print(phone)
break
except AttributeError:
pass
else:
print("phone number has not been found")
find_phone("here is the weird formatted phone number: +33 6 29 37 24 57")
我想这就是你想要的:
import re
def find_phone(text):
pattern_preference = [
r"(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?",
r"(?:\+?(\d{1,3}))?[-. (]*(\d{1,3})[-. )]*(\d{1,3})[-. ]*(\d{1,4})([-. ]*(\d{1,4}))?([-. ]*(\d{1,4}))?(?: *x(\d{1,4}))?"
]
for pattern in pattern_preference:
try:
pattern = re.compile(pattern)
#search for a phone number
mo = pattern.search(text)
phone = mo.group()
print(phone)
break
except AttributeError:
pass
else:
print("phone number has not been found")
find_phone("here is the weird formatted phone number: +33 6 29 37 24 57")
假设您有几种方法来检查电话号码。一种方法是在函数中设置一个计数器,并通过
if
语句选择要尝试的计数器
import re
def find_phone(text):
number_of_cases = 2
i = 0
while i < number_of_cases
try:
if i == 0:
pattern = re.compile(r"(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?")
#search for a phone number
mo = pattern.search(text)
phone = mo.group()
print (phone)
elif i == 1:
#don't want to use this pattern always because it's too wide and not perfect
pattern = re.compile(r"(?:\+?(\d{1,3}))?[-. (]*(\d{1,3})[-. )]*(\d{1,3})[-. ]*(\d{1,4})([-. ]*(\d{1,4}))?([-. ]*(\d{1,4}))?(?: *x(\d{1,4}))?")
mo = pattern.search(text)
phone = mo.group()
print (phone)
except AttributeError:
i += 1
else: break
重新导入
def find_电话(文本):
案例数量=2
i=0
而我<病例数
尝试:
如果i==0:
pattern=re.compile(r“(?:\+(\d{1,3}))?[-.(]*(\d{3})[-.]*(\d{3})[-.]*(\d{4})(?:*x(\d+)))
#搜索电话号码
mo=模式。搜索(文本)
电话=mo.group()
打印(电话)
elif i==1:
#我不想总是使用这种图案,因为它太宽而且不完美
pattern=re.compile(r“(?:\+?(\d{1,3}))?[-.(]*(\d{1,3})[-.]*(\d{1,3})[-.]*(\d{1,3})(\d{1,4})([-.]*(\d{1,4}))(?:*x(\d{1,4})))
mo=模式。搜索(文本)
电话=移动电话组()
打印(电话)
除属性错误外:
i+=1
其他:休息
另一个想法是检查您是否找到了电话号码假设您有几种方法来检查电话号码。一种方法是在函数中设置一个计数器,并通过
if
语句选择要尝试的计数器
import re
def find_phone(text):
number_of_cases = 2
i = 0
while i < number_of_cases
try:
if i == 0:
pattern = re.compile(r"(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?")
#search for a phone number
mo = pattern.search(text)
phone = mo.group()
print (phone)
elif i == 1:
#don't want to use this pattern always because it's too wide and not perfect
pattern = re.compile(r"(?:\+?(\d{1,3}))?[-. (]*(\d{1,3})[-. )]*(\d{1,3})[-. ]*(\d{1,4})([-. ]*(\d{1,4}))?([-. ]*(\d{1,4}))?(?: *x(\d{1,4}))?")
mo = pattern.search(text)
phone = mo.group()
print (phone)
except AttributeError:
i += 1
else: break
重新导入
def find_电话(文本):
案例数量=2
i=0
而我<病例数
尝试:
如果i==0:
pattern=re.compile(r“(?:\+(\d{1,3}))?[-.(]*(\d{3})[-.]*(\d{3})[-.]*(\d{4})(?:*x(\d+)))
#搜索电话号码
mo=模式。搜索(文本)
电话=移动电话组()
打印(电话)
elif i==1:
#我不想总是使用这种图案,因为它太宽而且不完美
pattern=re.compile(r“(?:\+?(\d{1,3}))?[-.(]*(\d{1,3})[-.]*(\d{1,3})[-.]*(\d{1,3})(\d{1,4})([-.]*(\d{1,4}))(?:*x(\d{1,4})))
mo=模式。搜索(文本)
电话=移动电话组()
打印(电话)
除属性错误外:
i+=1
其他:休息
另一个想法是检查您是否找到了电话号码这里的问题是您试图在无对象上调用类似于
group
/groups
的函数。中对此进行了解释,其中指出,如果没有匹配项,则不会返回任何匹配项
因此,您的问题减少到验证结果是否为无
def find_phone(text):
pattern = re.pattern(first_pattern)
match = pattern.search(test)
if not match:
pattern2 = re.pattern(second_pattern)
match2 = pattern2.search(test)
if not match2:
return None
phone = match.group(...)
return phone
但是,为了可读性,我会将第一个if语句中的代码重构为另一个函数,例如
def find_phone_with_special_pattern(text):
pattern = re.pattern(second_pattern)
match = pattern.search(test)
if not match:
return None
phone = match.group(...)
return phone
def find_phone(text):
pattern = re.pattern(first_pattern)
match = pattern.search(test)
if not match:
return find_phone_with_special_pattern(text)
phone = match.group(...)
return phone
如您所见,此代码也可以重构:
def find_phone_with_pattern(pattern, text):
pattern = re.pattern(...)
match = pattern.search(...)
if not match:
return None
phone = match.group(...)
return phone
def find_phone(text):
phone = find_phone_with_pattern("normal-pattern-here", text)
if not phone:
phone = find_phone_with_pattern("alternative-pattern-here", text)
return phone
这基本上是一种“重试”机制。有时候你很幸运,可以很容易地用这种方式实现它,而有时候你必须捕获异常并考虑如何实现它。这里的问题是,你试图在一个无对象上调用一个类似
group
/groups
的函数。中对此进行了解释,其中指出,如果没有匹配项,则不会返回任何匹配项
因此,您的问题减少到验证结果是否为无
def find_phone(text):
pattern = re.pattern(first_pattern)
match = pattern.search(test)
if not match:
pattern2 = re.pattern(second_pattern)
match2 = pattern2.search(test)
if not match2:
return None
phone = match.group(...)
return phone
但是,为了可读性,我会将第一个if语句中的代码重构为另一个函数,例如
def find_phone_with_special_pattern(text):
pattern = re.pattern(second_pattern)
match = pattern.search(test)
if not match:
return None
phone = match.group(...)
return phone
def find_phone(text):
pattern = re.pattern(first_pattern)
match = pattern.search(test)
if not match:
return find_phone_with_special_pattern(text)
phone = match.group(...)
return phone
如您所见,此代码也可以重构:
def find_phone_with_pattern(pattern, text):
pattern = re.pattern(...)
match = pattern.search(...)
if not match:
return None
phone = match.group(...)
return phone
def find_phone(text):
phone = find_phone_with_pattern("normal-pattern-here", text)
if not phone:
phone = find_phone_with_pattern("alternative-pattern-here", text)
return phone
这基本上是一种“重试”机制。有时候你很幸运,你可以用这种方式很容易地实现它,而有时候你必须捕捉异常并思考如何实现它。我认为这个问题太模糊,无法得到恰当的回答。如果你给出一个真实用例的例子,我们可能会给你更多的帮助。第一个可能失败的呼叫是什么?网络问题?检查元素是否在列表/目录中?好的,我添加了一段代码。谢谢你的帮助。我认为这个问题太模糊了,无法得到恰当的回答。如果你给出一个真实用例的例子,我们可能会给你更多的帮助。第一个可能失败的呼叫是什么?网络问题?检查元素是否在列表/目录中?好的,我添加了一段代码。谢谢你的帮助。谢谢,但我的意思是,对于一种例外情况,我有不同的解决方案。我已经更新了我的问题,添加了真实的代码。这能解决你的问题吗?它允许您向patterns_preference添加多个模式。它完全可以:)谢谢,但我的意思是,对于一种异常,我有不同的解决方案。我已经更新了我的问题,添加了真实的代码。这能解决你的问题吗?它允许您向patterns_preference添加多个模式。它完全可以:)re.search(pattern,string,flags=0)如果字符串中没有与模式匹配的位置,则返回None。感谢您指向文档和酷的解决方案!不客气!如果你认为这是你的问题的正确答案,你也可以把它标记为最好的答案。(您有时间等待其他答案,可能没有限制)如果字符串中没有与模式匹配的位置,则重新搜索(pattern,string,flags=0)将返回None。感谢您指向文档和酷的解决方案!不客气!如果你认为这是你的问题的正确答案,你也可以把它标记为最好的答案。(您有时间等待其他答案,可能没有限制)