我可以组合if else和try catch python吗?

时间:2017-06-06 05:19:28

标签: python

我有一个代码:

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,它将运行条件,否则它将运行尝试条件,直到流程结束。

有更好的方法来点这个吗?

3 个答案:

答案 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无效),您应该只捕获与此问题相关的异常。