#include <iostream> using namespace std; struct A { A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; A Ok() { return {}; } A NotOk() { throw "NotOk"; } struct B { A a1; A a2; }; void f(B) {} int main() { try { f({ Ok(), […]
我是新来的node.js,虽然我一般熟悉JavaScript。 我的问题是关于如何处理node.js中的错误的“最佳实践”。 通常,在编写Web服务器,FastCGI服务器或各种语言的网页时,我在multithreading环境中使用阻塞处理程序的exception。 当一个请求进来,我通常做这样的事情: function handleRequest(request, response) { try { if (request.url=="whatever") handleWhateverRequest(request, response); else throw new Error("404 not found"); } catch (e) { response.writeHead(500, {'Content-Type': 'text/plain'}); response.end("Server error: "+e.message); } } function handleWhateverRequest(request, response) { if (something) throw new Error("something bad happened"); Response.end("OK"); } 这样,我总是可以处理内部错误,并发送有效的响应给用户。 我明白,与node.js应该做非阻塞调用,这显然会导致不同数量的callback,如在这个例子中: var sys = require('sys'), fs = require('fs'); require("http").createServer(handleRequest).listen(8124); […]
我们在C ++中使用RAII的次数越多,发现自己的析构函数就越不重要。 现在,释放(最终确定,但是你想调用它)可能会失败,在这种情况下,exception确实是让楼上任何人知道我们的重新分配问题的唯一方法。 但是再一次,抛出析构函数是一个糟糕的主意,因为堆栈展开期间可能抛出exception。 std::uncaught_exception()可以让你知道什么时候发生了,但是除此之外,除了让你在终止之前logging消息之外,没有什么可以做的,除非你愿意让你的程序处于一个未定义的状态,有些东西被释放/定稿,有些则没有。 一种方法是有无抛出的析构函数。 但在很多情况下,这只是一个真正的错误。 例如,我们的析构函数可能会由于抛出一些exception而closures一些RAIIpipe理的数据库连接,而这些数据库连接可能无法closures。 这并不一定意味着我们可以在这个程序结束的时候继续。 另一方面,logging和追踪这些错误并不是每个案例的真正解决scheme, 否则我们就不需要例外了。 使用无抛析析构函数,我们也发现自己必须创build应该在破坏之前被调用的“reset()”函数,但是这只是打败了RAII的全部目的。 另一种方法就是让程序终止 ,因为这是你可以做的最可预测的事情。 有人build议链接exception,以便一次处理多个错误。 但是我真的从来没有真正看到过用C ++做的事情,我也不知道如何实现这样的事情。 所以它是RAII或例外。 不是吗? 我倾向于无耻的破坏者; 主要是因为它使事情变得简单(r)。 但我真的希望有一个更好的解决scheme,因为正如我所说的,我们使用RAII越多,我们就越发现自己使用的是不重要的东西。 附录 我添加链接到有趣的主题文章和我已经find的讨论: 投掷破坏者 关于SEH问题的 StackOverflow讨论 StackOverflow关于throwing-destructors的讨论(感谢,Martin York) 乔尔在例外 SEH被认为是有害的 CLRexception处理也涉及exception链接 草药Sutter对std :: uncaught_exception和为什么它没有你想象的那么有用 有关参与者的历史讨论 (长!) Stroustrup解释RAII Andrei Alexandrescu的范围卫队
我想返回一个视图不会发出redirect到用户的基础上,可能会从我的应用程序发生的某些错误,我想处理错误+日志他们在我的基本控制器,我不想错误传播到我的Global.asax – Application_Error()方法,因为我想这个方法来处理我的应用程序内的任何其他错误,例如用户input一个虚假的URL,有没有人find解决办法? 注:我已经离开了我的评论代码,因为我有一些问题的解决方法,这也表明我有多个例外可能处理… 编辑:如果我在此OnException中发出RedirectToAction覆盖一切正常,但我只想返回视图,没有redirect… 我的基地控制器的方法是: protected override void OnException(ExceptionContext filterContext) { //dont interfere if the exception is already handled if (filterContext.ExceptionHandled) return; //let the next request know what went wrong filterContext.Controller.TempData["exception"] = filterContext.Exception; //log exception _logging.Error(User.Identity.Name, ExceptionHelper.BuildWebExceptionMessage(filterContext.Exception)); //set up redirect to my global error handler //if (filterContext.Exception.GetType() == typeof(NoAccessException)) // filterContext.Result = View(new RouteValueDictionary […]
我有一个string属性具有最大长度要求,因为数据链接到数据库。 如果调用者试图设置一个超过这个长度的string,我应该抛出什么exception? 例如,这个C#代码: public string MyProperty { get { return _MyBackingField; } set { if (value.Length > 100) throw new FooException("MyProperty has a maximum length of 100."); _MyBackingField = value; } } 我考虑过ArgumentException ,但它看起来不正确。 从技术上讲 ,它是一个函数 – MyProperty_set(string value) – 所以可以创build一个ArgumentException的情况,但它不会被调用作为消费者眼中的函数 – 它是在赋值运算符的右侧。 这个问题大概也可以扩展到包含在属性设置器中进行的各种数据validation,但是我对上述情况特别感兴趣。
我已经阅读了一些关于C#exception处理实践的其他问题,但似乎没有人问我在找什么。 如果我为特定的类或一组类实现自己的自定义exception。 应该把与这些类有关的所有错误封装到使用内部exception的exception中,还是让它们通过? 我在想,最好能够抓住所有exception,以便能够立即从我的源头识别exception。 我仍然把最初的exception作为一个内部的exception。 另一方面,我认为重新抛出exception是多余的。 例外: class FooException : Exception { //… } select1: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 […]
在没有catch块的情况下使用try-finally块是否合适?
这个问题引发了围绕这篇文章的讨论,我没有收到任何好的答案。 为什么要logging你的exception,然后重新抛出它(当然保留原始的堆栈跟踪)是一个坏主意,如果你不能处理它呢?
在C#中,我如何定义自己的exception?
为什么我们需要在.NET?创build自定义的exception.NET?