我创建了以下脚本(Python版本2.x)以验证IP地址
如果传递了IP验证,脚本将打印确定
否则脚本将打印失败
验证非常好,
但是我不想打印的是异常产生的错误(参见脚本的Exe),
我只想打印OK或Fail,并将标准错误重定向为null
请在我的脚本中建议需要更新的内容吗?
#!/usr/bin/python
import commands
import subprocess
import os
import re
import socket
def validIP(address):
parts = address.split(".")
if len(parts) != 4:
return False
for item in parts:
if not 0 <= int(item) <= 255:
return False
try:
socket.inet_aton(address)
return True
except socket.error:
return False
f = open('/dev/null', 'w')
sys.stdout = f
f.close()
address = raw_input("Please enter IP address : ")
res = validIP(address)
if res == True:
print"OK"
else:
print "Fail"
执行脚本:(来自Linux red-hat machine version 6)
./Check_IP_Address.py
Please enter IP address : 192.9.200.WRONG
Traceback (most recent call last):
File "./Check_IP_Address.py", line 37, in <module>
res = validIP(address)
File "./Check_IP_Address.py", line 23, in validIP
if not 0 <= int(item) <= 255:
ValueError: invalid literal for int() with base 10: 'WRONG'
答案 0 :(得分:1)
根据您的陈述,抓住ValueError例外可以解决您的问题。你不应该只留下Errors or Exceptions
。你应该直接抓住它们。
try:
if not 0 <= int(item) <= 255:
return False
except ValueError as e:
return False
答案 1 :(得分:0)
看起来你不知道如何正确捕获异常,这让我想知道stderr是否在你的范围内 - 你不应该仅通过复制粘贴示例进行编程,你应该努力理解你编写的代码。如果你想通过捕获异常来使它静音,你只需抓住它:
for items in parts:
try:
if not 0 <= int(item) <= 255:
return False
except ValueError:
return False # probably the correct thing to do if `item` is not convertible to int.
请注意,如果没有计划如何成功地面对错误,您可能不应该使错误沉默。从蟒蛇的禅宗:
第二个意思是通过实际处理异常来明确表达他们的沉默。如果你无法处理异常,那么退出并获得追溯可能会更好。
如果你无论如何都要沉默stderr
(你可能不应该这样做,因为这会使你没有处理的错误变得沉寂,这意味着你不会知道为什么你的程序突然就会消失掉出现问题)您可以通过在dev/null
上打开dup2
和STDERR_FILENO
文件描述符来替换(即2
)。例如
import os
f = open("/dev/null", "w")
os.dup2(f.fileno(), 2)
f.close()
f.fubar # this will fail and raise exception - which you shouldn't see