检查给定的输入是否是有效的 IP 或主机名或无效的内容
Check if given input is a valid IP or Hostname or something invalid
我正在尝试创建一个程序来检查给定的输入是否是有效的主机名、有效的 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-except 块。问题是 xyz
在 gethostbyname
中导致 运行 次错误——而不是 False
值,程序转交给错误处理程序。像
try:
sock = socket.gethostbyname(hostname)
if sock == ...
except:
print("Something is wrong")
您可以添加一个简单的 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:
来捕获所有内容通常被认为是一种不好的做法,除非您对此表示满意。
首先我觉得你的概念有问题:
check whether the given input is a valid Hostname or valid IP or none of them either
您可以使用 IPv4 和 IPv6 的 RFC 检查 IP 是否有效,但您永远不能丢弃主机名,因为 xyz
可以在您的 LAN 内访问,而不是从 Internet 访问。
我也不太了解 python,但您的代码似乎正在生成一个必须用 try-catch 块捕获的异常。
我正在尝试创建一个程序来检查给定的输入是否是有效的主机名、有效的 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-except 块。问题是 xyz
在 gethostbyname
中导致 运行 次错误——而不是 False
值,程序转交给错误处理程序。像
try:
sock = socket.gethostbyname(hostname)
if sock == ...
except:
print("Something is wrong")
您可以添加一个简单的 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:
来捕获所有内容通常被认为是一种不好的做法,除非您对此表示满意。
首先我觉得你的概念有问题:
check whether the given input is a valid Hostname or valid IP or none of them either
您可以使用 IPv4 和 IPv6 的 RFC 检查 IP 是否有效,但您永远不能丢弃主机名,因为 xyz
可以在您的 LAN 内访问,而不是从 Internet 访问。
我也不太了解 python,但您的代码似乎正在生成一个必须用 try-catch 块捕获的异常。