我有一个自定义异常过滤器,我通过向我的类添加[CustomExceptionFilter]属性来调用.它按照我的意愿工作,但是如果action方法返回一个局部视图(通过ajax请求),异常(基本上是一个重定向到一个未授权的页面),正在加载部分视图页.有没有办法可以强制它重新加载'父'网址?
以下是自定义异常过滤器的代码
public class CustomExceptionFilter : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception.GetType() == typeof(CustomSecurityException))
{
filterContext.ExceptionHandled = true;
RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "NoAccess", action = "Index", message = filterContext.Exception.Message })).VirtualPath;
filterContext.HttpContext.Response.Redirect(url, true);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我的解决方案的遗留代码中有大量自定义异常.我想测试所有
我的项目中引入的自定义异常,以查看它们是否可序列化(XML)
那么,当自定义异常可序列化时,我的测试应该检查什么?
说自定义异常是可序列化的最低要求是什么?
我正在研究一个日志记录程序,我想避免在Exception重复记录时反复处理同一个对象,因为它是通过嵌套的调用结构进行渗透.所以我希望能够将Exception对象格式化一次,并为格式化版本提供一个唯一的"异常编号",然后Exception以某种方式标记该对象,以便在以后的日志调用中再次出现时我能够识别它.
我想出的想法是滥用对象的HelpLink字段Exception.我将它设置为包含我的"例外号码"的字符串版本.然后我可以识别该Exception对象,如果它在另一个日志调用中暂时再次出现.
但这可能是一个坏主意吗?有没有涉及我没有想过的陷阱?如果是这样,有没有人有更好的主意?
编辑:为了解释这种情况,这个记录器只会用在我自己的程序上.
我开始使用IronPython和VS2010,我在调试环境方面遇到了麻烦......有人能指出我正确的方向吗?请注意,我的python知识不到一周,所以我的问题很可能是自己造成的.
最令人讨厌的问题是,当发生异常时,VS调试器不会破坏异常发生的位置......但它似乎在最高级别中断.这样就可以确定异常发生的地方是令人沮丧的断点和踩踏行为.
另一个烦恼是提高自定义异常.调试器只告诉我异常的类名而不是消息(但是本机铁python异常包括两者).例如:
class MyCustomError(BaseException):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
Run Code Online (Sandbox Code Playgroud)
当被引发时(例如"提升MyCustomError('一些好消息')")我在调试器中看到的所有$ exception都是"MyCustomError"....当我真的想看到不仅是类名而且还有值.
任何帮助,将不胜感激!!
我是C++的新手,并且发现了以下代码片段,用于从std :: exception扩展的自定义异常.我不理解的唯一部分是: err_msg(msg) {}构造函数定义之后.任何人都可以解释为什么这不是在函数括号中?
class my_exception : public std::exception {
private:
std::string err_msg;
public:
my_exception(const char *msg) : err_msg(msg) {};
~my_exception() throw() {};
const char *what() const throw() { return this->err_msg.c_str(); };
};
Run Code Online (Sandbox Code Playgroud) 在我的Rails 3.2应用程序中,我正在尝试使用config.exceptions_app通过路由表路由异常以呈现特定于错误的页面(尤其是401 Forbidden页面).这是我到目前为止配置的内容:
# application.rb
config.action_dispatch.rescue_responses.merge!('Error::Forbidden' => :forbidden)
config.exceptions_app = ->(env) { ErrorsController.action(:show).call(env) }
# development.rb
config.consider_all_requests_local = false
# test.rb
config.consider_all_requests_local = false
Run Code Online (Sandbox Code Playgroud)
现在问题的关键是:
module Error
class Forbidden < StandardError
end
end
class ErrorsController < ApplicationController
layout 'error'
def show
exception = env['action_dispatch.exception']
status_code = ActionDispatch::ExceptionWrapper.new(env, exception).status_code
rescue_response = ActionDispatch::ExceptionWrapper.rescue_responses[exception.class.name]
render :action => rescue_response, :status => status_code, :formats => [:html]
end
def forbidden
render :status => :forbidden, :formats => [:html]
end
end
Run Code Online (Sandbox Code Playgroud)
当我想渲染401响应时,我只是raise Error::Forbidden在开发环境中完美地工作.但是在rspec中运行示例时,例如:
it 'should return …Run Code Online (Sandbox Code Playgroud) 我正在std::terminate通过使用用于抛出、抛出的类的复制构造函数来测试在进行堆栈展开调用时如何抛出。
根据 C++14 N4296 - §15.1.3:
抛出异常复制初始化 (8.5, 12.8) 一个临时对象,称为异常对象。临时是一个左值,用于初始化在匹配处理程序 (15.3) 中声明的变量。
class X
{
public:
X() = default;
X(const X&)
{
throw std::runtime_error{"X copy constructor"};
}
};
int main()
{
try
{
throw X{};
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl; // this line gets executed, does not terminate
}
catch(const X& other)
{
std::cout << "X exception" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码没有调用std::terminate?根据我对上述代码的理解, ,throw X{}内部try开始堆栈缠绕,然后调用复制构造函数来调用处理程序,但复制构造函数也会抛出。请注意,如果更改复制构造函数的 throw 表达式,throw …
假设我想绑定所有项目
#mainDiv .user
Run Code Online (Sandbox Code Playgroud)
除了
#mainDiv #exception .user
Run Code Online (Sandbox Code Playgroud)
我能想到
$('#mainDiv .user').bind('event',function(){
if($(this).parents('#exception').length>0){}else{
// do stuff;
}
});
Run Code Online (Sandbox Code Playgroud)
要么:
$('#mainDiv :not('#exception').find('.user').bind('event',function(){
if($(this).parents('#exception').length>0){}else{
// do stuff;
}
});
Run Code Online (Sandbox Code Playgroud)
什么是更好的?
所以这是关于我最近被问到的面试问题.面试官通过询问我们如何创建自定义异常来开始这一点.在回答这个问题时,他问我如何创建RunTimeExceptions.我说我们创建它们的方式与创建选中的Exceptions相同.我们的自定义异常将从RunTimeException类扩展.然后他问你在什么情况下会创建自己的RunTimeException.现在我想不出一个好的答案.在我的所有项目中,我们都创建了自定义RunTimeExceptions.
我还认为我们永远不应该创建RunTimeExceptions.JVM只能以有限的方式失败,并且可以很好地处理它们.在编写应用程序时,我们无法预测可能发生的运行时异常,因此我们不需要处理它们.如果我们可以预测这些条件,那么它们就不是RunTimeExceptions.由于我们既不需要新的运行时异常,也不需要处理runtimeexceptions,为什么我们需要创建自定义的RunTimeException.我们可以预先考虑作为可能的失败条件的所有内容都应该在编译时处理,这将是一个经过检查的异常.对?只有在编译时无法处理的事物和依赖于运行时事物的事物才会进入RunTimeExceptions类别.
即使我们编写自定义RunTimeExceptions然后应该抛出RunTimeException的自定义方法 - 我们如何确保该方法将抛出该特定的RunTimeException.我们如何进行映射.这对我来说似乎不太可能.
我在这里遗漏了什么/很多东西吗?好心劝告.
谢谢,陈.
我的业务层中有几个自定义异常,在我的ASP.NET应用程序中冒泡到我的API方法.
目前,它们都转换为Http状态500.如何映射这些自定义异常,以便我可以返回不同的Http状态代码?