.NET错误处理:try/catch VS事件VS return-value/status-fields

sam*_*mis 7 .net c# visual-studio-2010 xamarin.android

我现在正处于跨平台移动应用程序开发的一个非常关键的交叉路上,并且可以真正使用一些专业知识(如woah).

给予一定的上下文(可以回答我希望帮助),我开发基于方便,花花公子MonoCross框架.NET移动应用,使用VS2010U(不MonoDevelop的,然而,这是IOS).第一个目标平台是Android,然后是IOS和Windows Phone"端口"(如果我做对了,那就不是真的).

现在我已经奠定了坚实的基础,包括业务逻辑,数据访问层,数据库,REST Web服务等,我正在经历并试图在一些错误处理中工作,但我不确定这是什么最好的方法是.

我被告知try-catch块可能是性能命中(在这种情况下这是一个大问题),
这是真的吗?我应该使用它们谨慎,或者只是一巴掌EM地方的异常可能会被抛出(我还挺想用他们在我所有的SQLite的API调用,因为我不知道他们在做什么赫克一半的时间做).

使用事件回调是错误处理的坏事吗?我被告知只要有可能使用这些,而不是的try-catch,出于性能的原因,但我不想破坏任何设计原则和范例,并与马虎,gauh-loppy码所有的地方结束.

第三个选项,具有最小的开销,但处理起来极其烦人,是状态字段和返回值.

那你觉得怎么样?我想我正在寻找一些大方向,也许还有一些关于何时何地使用每种方法的建议,以及我最有可能遗漏的任何其他技术.如果需要更多细节,请告诉我,因为我很乐意给他们.

感谢您抽出宝贵时间!

Sam*_*ell 1

有时理论与特定的实现并不相符,但我想 Mono 已经采用这些概念一段时间了。

\n\n

适当的运行时总是有利于无异常情况下的性能。理想情况下,在没有抛出异常的情况下,try/catch 块的执行应该就像 try 块的内容自行执行一样,而 try/finally 块的执行应该就像 try 和finally 块的内容被执行一样。按顺序执行。当使用 CIL 字节码解释器时,通常不可能像我在这里提到的那样没有开销地执行这些操作。然而,一个像样的 JIT 或 AOT 编译器(就像使用 Mono 一样)实际上会生成在无异常情况下运行速度与省略 try/catch/finally 结构时一样快的代码。\xc2\xb9

\n\n

如果您选择错误代码策略,即使没有发生错误,您的应用程序最终也会执行部分错误处理代码(向方法传递额外参数、计算和测试返回代码等)。因此,您的目标是将异常处理的使用限制在真正的异常情况下。此策略可实现健壮的应用程序(正确的错误处理),而不会降低性能关键成功案例的性能。

\n\n

\xc2\xb9 对于嵌入数值计算循环体中的 try/finally 块来说,这并不是 100% 准确,但是当正确用于处理异常情况时,它产生可观察到的性能影响的机会几乎为零这点。具体来说,与没有 try/finally 块的相同方法相比,为 X86 编译的 try/finally 块 JIT 将包括类似于 push/pop/jmp(本地分支)指令的代码。这比调用定义为以下的方法的开销更少:public static void Foo() {}

\n