我正在尝试创建一个程序来检查给定的输入是有效的主机名、有效的 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

最佳答案

您可以添加一个简单的 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 s(或者如果以一种方式处理该组,则将它们组合在一起)。仅使用 except: 来捕获所有内容通常被认为是一种不好的做法,除非您对此感到满意。

关于python - 检查给定的输入是否是有效的 IP 或主机名或无效的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48308202/

10-12 21:39