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

Aer*_*tyl 3 python validation networking network-programming python-3.x

我正在尝试创建一个程序来检查给定的输入是有效的主机名,有效的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")
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

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
Run Code Online (Sandbox Code Playgroud)

r.o*_*ook 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()
Run Code Online (Sandbox Code Playgroud)

一些事情:

1.)我添加了一个main()函数,只是在你的__main__支票中调用它,因为它似乎是一个更好的做法.我不认为你的问题有什么问题,但根据我的经验,大多数人用这种方式编码,可能是因为#main()在调试过程中更容易注释掉几行,甚至在本地测试不同的函数.

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