在现代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__.这似乎很多打字,是否有必要?
有没有什么方法可以在我的jQuery AJAX错误消息中显示自定义异常消息作为警报?
例如,如果我想通过Struts by 在服务器端抛出异常throw new ApplicationException("User name already exists");,我想在jQuery AJAX错误消息中捕获此消息('用户名已存在').
jQuery("#save").click(function () {
if (jQuery('#form').jVal()) {
jQuery.ajax({
type: "POST",
url: "saveuser.do",
dataType: "html",
data: "userId=" + encodeURIComponent(trim(document.forms[0].userId.value)),
success: function (response) {
jQuery("#usergrid").trigger("reloadGrid");
clear();
alert("Details saved successfully!!!");
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
在第二个警报,我警告抛出的错误,我得到undefined,状态代码是500.
我不确定我哪里出错了.我该怎么做才能解决这个问题?
我似乎无法找到有关自定义异常类的更多信息.
我所知道的
您可以声明自定义错误类并让它继承StandardError,因此它可以是rescued:
class MyCustomError < StandardError
end
Run Code Online (Sandbox Code Playgroud)
这允许您使用以下方法来提高它:
raise MyCustomError, "A message"
Run Code Online (Sandbox Code Playgroud)
然后,在救援时获取该消息
rescue MyCustomError => e
puts e.message # => "A message"
Run Code Online (Sandbox Code Playgroud)
我不知道的
我想给我的异常一些自定义字段,但我想message从父类继承该属性.我发现阅读关于这个主题是@message不是异常类的实例变量,所以我很担心我的遗产将无法正常工作.
谁能给我更多细节呢?如何使用object属性实现自定义错误类?以下是正确的:
class MyCustomError < StandardError
attr_reader :object
def initialize(message, object)
super(message)
@object = object
end
end
Run Code Online (Sandbox Code Playgroud)
然后:
raise MyCustomError.new(anObject), "A message"
Run Code Online (Sandbox Code Playgroud)
要得到:
rescue MyCustomError => e
puts e.message # => "A message"
puts e.object # => anObject
Run Code Online (Sandbox Code Playgroud)
它会起作用,如果确实如此,这是正确的做事方式吗?
ruby inheritance exception-handling exception custom-exceptions
是否可以创建用户定义的异常并能够更改SQLERRM?
例如:
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
Run Code Online (Sandbox Code Playgroud)
输出是"用户定义的例外".是否可以更改该消息?
编辑:这里有一些更详细的信息.
我希望这个说明我想要做得更好.
DECLARE
l_table_status VARCHAR2(8);
l_index_status VARCHAR2(8);
l_table_name VARCHAR2(30) := 'TEST';
l_index_name VARCHAR2(30) := 'IDX_TEST';
ex_no_metadata EXCEPTION;
BEGIN
BEGIN
SELECT STATUS
INTO l_table_status
FROM USER_TABLES
WHERE TABLE_NAME = l_table_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Table metadata does not exist."
RAISE ex_no_metadata;
END;
BEGIN
SELECT STATUS
INTO l_index_status
FROM USER_INDEXES
WHERE INDEX_NAME = l_index_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN …Run Code Online (Sandbox Code Playgroud) 在C#中实现自定义异常的行业标准最佳实践是什么?
我检查了谷歌,并提出了大量建议,但我不知道哪些建议具有更高的可信度.
如果任何人有权威文章的链接,那也会有所帮助.
我是第一个C++编程类的学生,我正在开发一个项目,我们必须创建多个自定义异常类,然后在我们的一个事件处理程序中,使用一个try/catch块来适当地处理它们.
我的问题是:如何在我的块中捕获多个自定义异常try/catch?GetMessage()是我的异常类中的自定义方法,它将异常解释作为a返回std::string.下面我已经包含了我项目中的所有相关代码.
谢谢你的帮助!
try/catch块
// This is in one of my event handlers, newEnd is a wxTextCtrl
try {
first.ValidateData();
newEndT = first.ComputeEndTime();
*newEnd << newEndT;
}
catch (// don't know what do to here) {
wxMessageBox(_(e.GetMessage()),
_("Something Went Wrong!"),
wxOK | wxICON_INFORMATION, this);;
}
Run Code Online (Sandbox Code Playgroud)
ValidateData()方法
void Time::ValidateData()
{
int startHours, startMins, endHours, endMins;
startHours = startTime / MINUTES_TO_HOURS;
startMins = startTime % MINUTES_TO_HOURS;
endHours = endTime / MINUTES_TO_HOURS;
endMins …Run Code Online (Sandbox Code Playgroud) 我已经阅读了一些关于C#异常处理实践的其他问题,但似乎没有人问我在寻找什么.
如果我为特定的类或一组类实现我自己的自定义Exception.是否应该使用内部异常将与这些类相关的所有错误封装到我的异常中,还是应该让它们落空?
我认为捕获所有异常会更好,以便可以从我的源代码中立即识别异常.我仍然将原始异常作为内部异常传递.另一方面,我认为重新抛出异常是多余的.
例外:
class FooException : Exception
{
//...
}
Run Code Online (Sandbox Code Playgroud)
选项1:Foo包围所有异常:
class Foo
{
DoSomething(int param)
{
try
{
if (/*Something Bad*/)
{
//violates business logic etc...
throw new FooException("Reason...");
}
//...
//something that might throw an exception
}
catch (FooException ex)
{
throw;
}
catch (Exception ex)
{
throw new FooException("Inner Exception", ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
选项2:Foo抛出特定的FooExceptions但允许其他异常落空:
class Foo
{
DoSomething(int param)
{
if (/*Something Bad*/)
{
//violates business logic etc...
throw new FooException("Reason...");
}
//...
//something that …Run Code Online (Sandbox Code Playgroud) class AppError(Exception):
pass
class MissingInputError(AppError):
pass
class ValidationError(AppError):
pass
Run Code Online (Sandbox Code Playgroud)
...
def validate(self):
""" Validate Input and save it """
params = self.__params
if 'key' in params:
self.__validateKey(escape(params['key'][0]))
else:
raise MissingInputError
if 'svc' in params:
self.__validateService(escape(params['svc'][0]))
else:
raise MissingInputError
if 'dt' in params:
self.__validateDate(escape(params['dt'][0]))
else:
raise MissingInputError
def __validateMulti(self, m):
""" Validate Multiple Days Request"""
if m not in Input.__validDays:
raise ValidationError
self.__dCast = int(m)
Run Code Online (Sandbox Code Playgroud)
validate()和__validateMulti()是验证和存储传递的输入参数的类的方法.从代码中可以看出,当一些输入参数丢失或某些验证失败时,我会引发一些自定义异常.
我想定义一些特定于我的应用程序的自定义错误代码和错误消息,比如
错误1100:"找不到关键参数.请验证您的输入."
错误1101:"找不到日期参数.请验证您的输入"
...
错误2100:"多天参数无效.接受的值为2,5和7."
并向用户报告.
(PS:这是Python 2.4.3).
巴斯蒂安伦纳德提到这个SO评论,你并不需要总是定义一个新的 …
如何编写基于Mockito的JUnit方法来测试此方法adduser()?我尝试写一个,但它失败了一条错误消息,说不处理异常.显示错误:
when(service.addUser("nginx")).thenReturn("apache");
Run Code Online (Sandbox Code Playgroud)
假设addUser()业务类中的方法永远不会捕获任何异常,并且不会重新抛出.
class Business {
public User addUser() throws ServiceException{
User user = service.addUser("nginx");
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
测试案例方法:
在测试类中,我使用@Mock属性模拟服务层类并注入它.
@Mock
Service service;
@InjectMocks
Business business = new Business();
@Test
public void testAddUser() {
when(service.addUser("nginx")).thenReturn("apache");
User user = business.addUser("nginx");
assertNotNull(user);
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何处理测试用例中的异常情况.
Douglas Crockford建议做这样的事情:
throw {
name: "System Error",
message: "Something horrible happened."
};
Run Code Online (Sandbox Code Playgroud)
但你也可以这样做:
function IllegalArgumentException(message) {
this.message = message;
}
throw new IllegalArgumentException("Argument cannot be less than zero");
Run Code Online (Sandbox Code Playgroud)
然后做:
try {
//some code that generates exceptions
} catch(e) {
if(e instanceof IllegalArgumentException) {
//handle this
} else if(e instanceof SomeOtherTypeOfException) {
//handle this
}
}
Run Code Online (Sandbox Code Playgroud)
我想你可以type在Crockford的实现中包含一个属性,然后检查它而不是做一个instanceof.做一个对另一个有什么好处吗?