在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循标准的其他异常类,因此(例如)我在异常中包含的任何额外字符串都会被捕获异常的任何工具打印出来.
通过"现代Python",我指的是将在Python 2.5中运行的东西,但对于Python 2.6和Python 3*的处理方式来说是"正确的".而"自定义"我指的是一个Exception对象,它可以包含有关错误原因的额外数据:一个字符串,也许还有一些与异常相关的任意对象.
我被Python 2.6.2中的以下弃用警告绊倒了:
>>> class MyError(Exception):
... def __init__(self, message):
... self.message = message
...
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
Run Code Online (Sandbox Code Playgroud)
看起来很疯狂,BaseException对于名为的属性具有特殊含义message.我从PEP-352收集到该属性确实在2.5中有特殊含义他们试图弃用,所以我猜这个名字(而且仅此一个)现在被禁止了?啊.
我也模糊地意识到它Exception有一些神奇的参数args,但我从来不知道如何使用它.我也不确定这是向前发展的正确方法; 我在网上发现的很多讨论都表明他们试图在Python 3中废除args.
更新:两个答案建议覆盖__init__,和__str__/ __unicode__/ __repr__.这似乎很多打字,是否有必要?
我正在编写一个程序来解析10个网站,查找数据文件,保存文件,然后解析它们以生成可以在NumPy库中使用的数据.有吨的错误该文件通过遇到不良链接,不好的XML,缺项,其他的事情我还没有进行分类.我最初制作这个程序来处理这样的错误:
try:
do_stuff()
except:
pass
Run Code Online (Sandbox Code Playgroud)
但现在我想记录错误:
try:
do_stuff()
except Exception, err:
print Exception, err
Run Code Online (Sandbox Code Playgroud)
请注意,这是打印到日志文件以供以后查看.这通常会打印非常无用的数据.我想要的是打印错误触发时打印的完全相同的行,没有try-except拦截异常,但我不希望它暂停我的程序,因为它嵌套在一系列for循环中,我想看完成了.
在Python中,我不时会看到块:
try:
try_this(whatever)
except SomeException as exception:
#Handle exception
else:
return something
Run Code Online (Sandbox Code Playgroud)
try-except-else存在的原因是什么?
我不喜欢那种编程,因为它使用异常来执行流控制.但是,如果它包含在语言中,那么必须有充分的理由,不是吗?
我的理解是,异常不是错误,它们只应用于特殊情况(例如我尝试将文件写入磁盘,没有更多空间,或者我没有权限),而不是流程控制.
通常我将异常处理为:
something = some_default_value
try:
something = try_this(whatever)
except SomeException as exception:
#Handle exception
finally:
return something
Run Code Online (Sandbox Code Playgroud)
或者如果我真的不想在发生异常时返回任何内容,那么:
try:
something = try_this(whatever)
return something
except SomeException as exception:
#Handle exception
Run Code Online (Sandbox Code Playgroud) 我已经阅读了"加注"的官方定义,但我仍然不太明白它的作用.
简单来说,什么是"提高"?
示例用法会有所帮助.
我正在编写一个模块,并希望为它可以引发的异常建立一个统一的异常层次结构(例如,从一个FooError抽象类继承所有foo模块的特定异常).这允许模块的用户捕获这些特定异常并在需要时明确地处理它们.但是由于其他一些例外,该模块提出的许多例外都被提出; 例如,由于文件上的OSError而导致某些任务失败.
我需要的是"包装"捕获的异常,使其具有不同的类型和消息,以便通过捕获异常的任何信息在传播层次结构中进一步提供信息.但我不想丢失现有的类型,消息和堆栈跟踪; 这对于试图调试问题的人来说都是有用的信息.顶级异常处理程序并不好,因为我试图在异常进入传播堆栈之前修饰异常,并且顶级处理程序为时已晚.
这部分是通过foo从现有类型(例如class FooPermissionError(OSError, FooError))派生模块的特定异常类型来解决的,但这并不会使现有异常实例包装在新类型中更容易,也不会修改消息.
Python的PEP 3134 "异常链接和嵌入式回溯"讨论了Python 3.0中为"链接"异常对象所接受的更改,以指示在处理现有异常期间引发了新的异常.
我正在尝试做的是相关:我需要它也在早期的Python版本中工作,我需要它不是为了链接,而只是为了多态.这样做的正确方法是什么?
我是Python新手,在处理自定义错误方面苦苦挣扎.当我的代码发现错误时,我希望它以红色字体抛出错误并将我带回Python终端而不会杀死Python.
我遇到了sys.exit()寻找答案,但它完全退出了Python.你知道吗,回抛出以红色字体出现错误的替代,并把我带回到终端?
这就是我到目前为止所拥有的.
import sys
def do_something(parameter):
if parameter > 100:
# quit the function and any function(s) that may have called it
sys.exit('Your parameter should not be greater than 100!')
else:
# otherwise, carry on with the rest of the code
Run Code Online (Sandbox Code Playgroud)
如果我不清楚,请告诉我,我很乐意提供更多详情.谢谢大家!
我在测试中从函数中引发异常时遇到问题:
### Implemetation
def MethodToTest():
myVar = StdObject()
try:
myVar.raiseError() # <--- here
return True
except Exception as e:
# ... code to test
return False
### Test file
@patch('stdLib.StdObject', autospec=True)
def test_MethodeToTest(self, mockedObjectConstructor):
mockedObj = mockedObjectConstructor.return_value
mockedObj.raiseError.side_effect = Exception('Test') # <--- do not work
ret = MethodToTest()
assert ret is False
Run Code Online (Sandbox Code Playgroud)
我想raiseError()发挥作用以引发错误.
我在SO上找到了几个例子,但没有一个符合我的需要.
我正在编写一个python函数,它使用两个大小相等的数组[n,1].在执行任何计算之前,我想检查以确保长度相同,如果不是,则返回错误.什么是最佳做法?
def do_some_stuff(array1, array2):
# Before doing stuff, check to ensure both arrays have the same length
if len(array1) != len(array2):
# Break and return with error
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我想打破并返回错误代码(比如-1).似乎break将返回没有任何值,返回将继续执行该函数?或者Return是否会突破任何剩余的代码?
我试图将异常提升代码块写入我的Python代码,以确保传递给函数的参数满足适当的条件(即使参数成为必需,类型检查参数,建立参数的边界值等等).我很满意地理解如何手动引发异常以及处理异常.
from numbers import Number
def foo(self, param1 = None, param2 = 0.0, param3 = 1.0):
if (param1 == None):
raise ValueError('This parameter is mandatory')
elif (not isinstance(param2, Number)):
raise ValueError('This parameter must be a valid Numerical value')
elif (param3 <= 0.0):
raise ValueError('This parameter must be a Positive Number')
...
Run Code Online (Sandbox Code Playgroud)
这是Python中可接受的(经过验证的)参数检查方式,但我不得不怀疑:由于Python除了if-then-else语句之外没有编写Switch-case的方法,是否有更有效或更正确的方法执行此任务?或者实施长期if-then-else语句是我唯一的选择?
python ×10
exception ×5
break ×1
function ×1
if-statement ×1
keyword ×1
mocking ×1
polymorphism ×1
quit ×1
raise ×1
try-catch ×1
typechecking ×1
unit-testing ×1