检查给定输入是否是有效的IP或主机名或无效的内容

时间:2018-01-17 19:02:15

标签: python python-3.x validation networking network-programming

我正在尝试创建一个程序来检查给定的输入是有效的主机名,有效的IP,还是两者都不是。 该程序能够识别有效的主机名或IP。但是,如果我尝试放置一些随机的内容,例如" xyz",它就不会打印出我想要的错误消息。

import socket
if __name__ == '__main__':
    hostname = 'hyuiolpp'
    if socket.gethostbyname(hostname) == hostname:
        print('{} is a valid IP address'.format(hostname))
    elif socket.gethostbyname(hostname) != hostname:
        print('{} is a valid hostname'.format(hostname))
    else:
        print("Something is wrong")

我得到的错误:

Traceback (most recent call last):
  File ".....", line 5, in <module>
    if socket.gethostbyname(hostname) == hostname:
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

3 个答案:

答案 0 :(得分:5)

您可以添加一个简单的try块并捕获生成的错误。

import socket

def main():
    hostname = 'hyuiolpp'
    try:
        if socket.gethostbyname(hostname) == hostname:
            print('{} is a valid IP address'.format(hostname))
        elif socket.gethostbyname(hostname) != hostname:
            print('{} is a valid hostname'.format(hostname))
    except socket.gaierror:
        print("Something is wrong")

if __name__ == '__main__':
   main()

少数事情:

1。)我添加了一个main()函数,并在__main__检查中调用它,因为这似乎是一种更好的做法。我不认为你的问题有什么不妥,但根据我的经验,大多数人用这种方式编码,可能是因为在调试期间评论一个#main()而不是几十行更容易甚至在本地测试不同的功能。

2。)您可能希望以不同的方式处理每个错误。在单元测试期间,您将了解引发的其他错误(在socket.gaierror旁边)以及您可能预期的错误,并弄清楚您的程序应该如何处理这些情况。您可以为每个错误添加额外的except(如果以单向方式处理组,则将它们组合在一起)。仅使用except:来捕捉所有内容通常被认为是一种不好的做法,除非你对此感到满意。

答案 1 :(得分:1)

使用try-except块。问题是xyz导致gethostbyname中的运行时错误 - 而不是False值,程序将转向错误处理程序。像

这样的东西
try: 
    sock = socket.gethostbyname(hostname)
    if sock == ...
except:
    print("Something is wrong") 

答案 2 :(得分:0)

首先,我认为你有一个概念问题:

  

检查给定输入是有效的主机名还是有效的IP,或者都不是

您可以使用适用于IPv4和IPv6的RFC检查IP是否有效,但是您永远不能丢弃主机名,因为您可以在局域网内访问xyz,而不是从互联网访问。

此外,我不太了解python,但似乎您的代码正在生成必须使用try-catch块捕获的异常。

相关问题