我正在尝试创建一个程序来检查给定的输入是有效的主机名,有效的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
答案 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块捕获的异常。