Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET错误处理:try/catch VS event VS return value/status字段_C#_.net_Visual Studio 2010_Xamarin.android - Fatal编程技术网

C# .NET错误处理:try/catch VS event VS return value/status字段

C# .NET错误处理:try/catch VS event VS return value/status字段,c#,.net,visual-studio-2010,xamarin.android,C#,.net,Visual Studio 2010,Xamarin.android,我现在正处于跨平台移动应用开发的关键十字路口,我真的需要一些专业知识(比如woah) 为了提供一些背景信息(我希望这有助于回答这个问题),我正在.NET中开发一个移动应用程序,它基于方便的dandy MonoCross框架,使用VS2010U(不是MonoDevelop,而是IOS)。第一个目标平台是Android,然后是IOS和Windows Phone的“端口”(如果我做得对的话就不是这样) 现在我有了一个坚实的基础,包括业务逻辑、数据访问层、数据库、REST WebService等。我正在

我现在正处于跨平台移动应用开发的关键十字路口,我真的需要一些专业知识(比如woah)

为了提供一些背景信息(我希望这有助于回答这个问题),我正在.NET中开发一个移动应用程序,它基于方便的dandy MonoCross框架,使用VS2010U(不是MonoDevelop,而是IOS)。第一个目标平台是Android,然后是IOS和Windows Phone的“端口”(如果我做得对的话就不是这样)

现在我有了一个坚实的基础,包括业务逻辑、数据访问层、数据库、REST WebService等。我正在经历并尝试在一些错误处理中工作,但是我不确定最好的方法是什么。

有人告诉我,try-catch块可能是性能命中(在本例中这是一个大问题),是
这是真的吗?我应该谨慎地使用它们,还是在可能引发异常的地方直接使用它们 (我有点想在我所有的SQLite API调用中使用它们,因为我不知道到底是什么 他们做了一半的时间)

使用事件回调对错误处理来说是件坏事吗?有人建议我在任何时候都使用这些 可能,而不是尝试捕捉,出于性能原因,但我不想破坏任何设计 原则和范例,最后到处都是草率的高卢-罗比代码

第三种选择,它的管理费用最少,但对交易来说是无限刺激的 使用,是状态字段和返回值

你们怎么想?我想我只是在寻找一些大致的方向,也许是关于何时何地使用它们的一些建议,以及我最有可能遗漏的任何其他技术。请让我知道,如果需要更多的细节,因为我很乐意给他们


感谢您为此抽出时间

使用
try/catch
以防捕获预期的异常。通常通过异常确定Workfow不是一个好的选择,但在IO操作的情况下,它可能是唯一的选择。例如,您向某个突然失去连接的外部设备写入数据。在这种情况下,您的程序将得到一个异常,但必须像处理常见错误一样处理它。

我认为,让您的程序难看的是,无论在哪里都进行异常处理,尽管我们有很好的异常处理模式

这些将在您的代码库中出现的功能称为横切关注点,如日志记录、安全性、审计、异常处理和

你可以在这里找到好的图案

值得一提的是,我不建议使用微软文档中推荐的EntLib

如果您寻找面向方面的编程(AOP),您会发现很好的资源。 最后一个提示是,实现将使用依赖注入/IoC框架来解决这些问题

我有点想在我所有的SQLite API调用中使用它们,因为我不知道它们有一半的时间在做什么

如果您说您正在使用一个库来与SQLite接口,那么这个库API很可能已经在某些错误情况下抛出异常。当然,在这种情况下,您应该使用try/catch来处理这些调用并处理这些错误情况

当您还没有自己编写代码时,当您正在使用其他人的库时,总是会出现这种情况

如何处理这些错误是你的决定

我的忠告是:

  • 在大多数情况下,我反对回调/事件。如果导致错误的API是异步的,并且程序流已经不是不言自明的,那么应该主要使用这些API
  • 抛出异常确实比状态代码/返回值慢,但它可以安全地在当前任何移动平台上,在应用程序不需要时间限制的任何情况下使用手机游戏使用异常抛出,并且它们对时间非常关键(某种程度上)
  • 抛出异常提供了更好的代码可读性——在我看来,这是一件主观的事情——并且是一种在发生错误时跳出当前上下文的好方法

有时理论与特定的实现不一致,但我想Mono已经有了这些概念一段时间了

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

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

对于嵌入到数值计算循环体中的try/finally块,这不是100%准确,但在适当用于处理异常情况时,其产生可观察性能影响的可能性实际上为零。具体地说,为X86编译的try/finally块JIT将包含类似于push/pop/jmp(本地分支)指令的代码,而没有try/finally块的方法是相同的。这比一个简单的系统开销少