c# - 什么更好/更快? try catch 或避免异常?

标签 c# exception

我想知道,在通用编程中什么更好或/和更快?避免异常还是等待异常?

避免异常是:

string a = null;
list = someMethod();
if(list.Length > 0 ){
   a = list[0];
}
if(a!=null) ...

或者 try catch 异常...

string a = null;
try{
    a = someMethod()[0];
catch{}
if(a!=null) ...

最佳答案

性能并不是这里最相关的问题。问题是,两者中的哪一个会导致程序更具可读性/可维护性/可测试性。您可以稍后再担心性能。

一般来说,不要使用异常来进行流量控制。它们实际上是一个非本地的 goto,这使得程序更难阅读和遵循。因此,它们应该保留用于特殊情况。如果您可以不使用 try-catch block 进行流量控制,那么就不要这样做。您的程序将更具可读性和可维护性。

处理这种情况的“正确”方法是

var list = someMethod();
if(list == null || list.Length == 0) {
    // handle something bad
}
string a = list[0];
if(a != null) {
    // go
}

如果存在保证从 someMethod 返回值的契约(Contract) (Contract.Ensures),您可以避免检查 list 不为空且不为空 不为 null 且不为空。

但是,确实,异常在本地是昂贵的。它们是否会影响程序的性能(即瓶颈)完全是另一个问题。但如果使用得当,异常通常不是瓶颈(当您的应用程序崩溃时谁会关心性能?)

关于c# - 什么更好/更快? try catch 或避免异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4628314/

相关文章:

java - 当获取设置了超时的 Future 结果时,哪里抛出了异常?

c# - 基于新的 RDLC 文件重新加载和刷新报表查看器

javascript - ASP.NET MVC : Populating select option with ajax

c# - A* 3D 寻路 - Unity

c++ - 如果文件在构造函数中不存在则抛出异常,并在 main() 中创建对象时尝试/捕获它,如果正确 - 开始使用该对象

java - 抛出子异常,捕获为 super 异常并重新抛出它但声明抛出子异常

java - IOException:关闭文件流时权限被拒绝

c# - 为什么 Xamarin 在单击按钮时出现错误?

c# - 尝试 "fix"LuaInterface 时出现 DllNotFoundException,但为什么呢?

asp.net-mvc - 这是 ASP.NET MVC 中异常处理的正确方法吗