我有一个代码:
s = '127.0.0.0'
def validate(a):
a = s.split('.')
if len(a) !=4:
return False
for x in a :
if not x.isdigit():
return False
i = int(x)
if i < 0 or i > 255 :
return False
return False
try:
validate(s) #ip validation
#my code here
except :
print("insert you're ip correctly")
我可以将 if else 与尝试捕获结合起来吗?
如果尝试抓住收到错误消息或者从如果条件返回false,它将运行除条件,否则它将运行尝试条件,直到流程结束。
有更好的方法来点这个吗?
答案 0 :(得分:1)
如果函数返回False,则可以通过执行以下操作引发异常:
s = '127.0.0.0'
def validate(a):
a = a.split('.')
if len(a) !=4:
return False
for x in a :
if not x.isdigit():
return False
i = int(x)
if i < 0 or i > 255 :
return False
return True
try:
if not validate(s): #ip validation
raise TypeError
except TypeError:
print("insert you're ip correctly")
注意:您最后可能希望return True
,因为我相信功能成功验证后,a = a.split('.')
不是s.split
,或者您是&#39} ;重新分割全局变量s
。
提示:当使用try ... except时,尝试捕获特定错误而不是使用catch-all except:
。
答案 1 :(得分:1)
上面的答案可能在技术上是正确的,但考虑到编码风格等。我没有看到任何理由在这里使用例外而不是普通的if else:
const lamp = (serial, type, od, ol, arc) => ({serial, type, od, ol, arc});
const lamps = [lamp(1,"g51",75,95,46), lamp(2,"g38",75,95,46), lamp(3,"9k",57,67,27)];
这实际上做了你想要的,而且阅读起来更清洁,更好。
答案 2 :(得分:0)
尝试/ catch是handle exceptions,而不是处理方法的返回值。在你的情况下,你写的东西会编译,但不是你想要做的。
最简单的解决方案是使用python中已有的内容,即。 socket,可以很好地验证IP。如果您仍想将validate()方法用于其他目的,那么您可以编写:
import socket
def validate(a):
socket.inet_aton(s)
try:
validate(s)
# your code here
except socket.error:
print("insert your ip correctly")
在这种情况下,socket.inet_aton方法会引发异常socket.error
,然后您可以捕获它。如果由于某种原因你不想使用套接字,那么你可以定义自己的异常,从validate()引出它并在validate()之外捕获它。
对于Python 3,ipaddress将为您提供更好的服务,因为套接字过于宽松(有充分的理由,请参阅man inet(3)):
import ipaddress
def validate(a):
ipaddress.ip_address(a)
try:
validate(s)
# your code here
except ValueError:
print("insert your ip correctly")
另一方面,我相信您希望return True
作为validate()的最后一行,但这不会改变问题。
在(第二)侧注释中,捕获所有异常(裸catch
语句)是不好的做法。在您的代码中,您处理特定错误(IP无效),您应该只捕获与此问题相关的异常。