C# 如何决定使用if/else还是try/catch?

C# 如何决定使用if/else还是try/catch?,c#,C#,在编写代码时,如何决定使用if/else还是try/catch?例如,在检查文件时,这应该基于if/else(if(file.Exists))还是try/catch块 例如,对文件的写入可以通过if/else块来创建文件,然后写入,或者假设文件存在,通过try/catch来处理。选择时有哪些考虑因素 谢谢只有在特殊情况下才能进行或使用特殊处理 在一个依赖于文件是否存在的场景中,当您可以简单地执行时,使用try-catch块是没有意义的 if(File.Exists(path)) { } else

在编写代码时,如何决定使用if/else还是try/catch?例如,在检查文件时,这应该基于if/else(if(file.Exists))还是try/catch块

例如,对文件的写入可以通过if/else块来创建文件,然后写入,或者假设文件存在,通过try/catch来处理。选择时有哪些考虑因素


谢谢

只有在特殊情况下才能进行或使用特殊处理

在一个依赖于文件是否存在的场景中,当您可以简单地执行时,使用try-catch块是没有意义的

if(File.Exists(path))
{
}
else
{

}

异常处理会对性能造成很大影响,因此请尝试通过在代码中应用更多的检查来最小化异常情况,例如if
File.Exists(path))

只有在异常情况下才能执行或使用异常处理

在一个依赖于文件是否存在的场景中,当您可以简单地执行时,使用try-catch块是没有意义的

if(File.Exists(path))
{
}
else
{

}

异常处理会导致大量性能损失,因此请尝试通过在代码中应用更多的检查来最小化异常情况,如if
File.Exists(path))

当文件预计不存在时,首先检查是否存在。但是,当缺少的文件是异常状态时,您应该用异常指示该异常状态

因此,基本思想是:
尽量避免在可能出现的情况下出现异常。

如果预期文件不存在,请先检查是否存在。但是,当缺少的文件是异常状态时,您应该用异常指示该异常状态

因此,基本思想是:
尽量避免在预期的情况下出现异常。

如果您认为该操作通常应该成功,那么
Try/catch
更容易阅读。特别是,如果故障原因很多(多个
catch
块)

否则,如果有时成功,有时失败——并且是由于特定原因,请使用
if/else
(这称为结构化异常处理)


一些人指出,使用
try/catch
处理异常是多么耗时。我倾向于按照以下思路阅读这样的建议:如果您的分析表明存在性能问题,请不要在一个紧密的内部循环中执行此操作。在编写初稿时,根本不用考虑在这个级别进行优化

如果您认为该操作通常应该成功,那么
try/catch
更容易阅读。特别是,如果故障原因很多(多个
catch
块)

否则,如果有时成功,有时失败——并且是由于特定原因,请使用
if/else
(这称为结构化异常处理)


一些人指出,使用
try/catch
处理异常是多么耗时。我倾向于按照以下思路阅读这样的建议:如果您的分析表明存在性能问题,请不要在一个紧密的内部循环中执行此操作。在编写初稿时,根本不用考虑在这个级别进行优化

您不应该使用try/catch进行流量控制


生成异常是一项极其昂贵的操作。If/else速度更快、更干净。

决不能使用try/catch进行流量控制

生成异常是一项极其昂贵的操作。If/else更快更干净。

一般来说,这取决于

对于基于文件的内容,您几乎总是希望尝试该操作并处理失败,而不是先检查。原因是文件系统是一个共享资源,您不能保证file.exists返回true后文件确实存在,因为其他进程可能同时删除了它

一般来说,这取决于


对于基于文件的内容,您几乎总是希望尝试该操作并处理失败,而不是先检查。原因是文件系统是一个共享资源,您不能保证file.exists返回true后文件确实存在,因为其他进程可能同时删除了它

在处理文件时,应始终使用try/catch,因为文件的状态可能会在程序之外更改

考虑以下代码位:

if(File.Exists("file.txt"))
    File.Delete("file.txt")
在调用
Delete()
之前,if语句后面的另一个进程可能已经删除了该文件。当您尝试删除它时,会引发异常

当使用文件时,还有很多事情要考虑,可能无法用IFS来捕获,例如文件在网络连接上不可用、更改访问权限、硬盘故障等。


这些事情超出了程序的控制范围,因此您应该准备好异常处理程序。

在处理文件时,您应该始终使用try/catch,因为文件的状态可能会在程序之外更改

考虑以下代码位:

if(File.Exists("file.txt"))
    File.Delete("file.txt")
在调用
Delete()
之前,if语句后面的另一个进程可能已经删除了该文件。当您尝试删除它时,会引发异常

当使用文件时,还有很多事情要考虑,可能无法用IFS来捕获,例如文件在网络连接上不可用、更改访问权限、硬盘故障等。


这些事情超出了程序的控制范围,因此您应该准备好异常处理程序。

通常,您应该同时执行这两项操作。
尝试/捕获以避免异常情况(文件突然从另一个线程中删除)。和if/else来处理非异常(检查文件是否存在)。Try/catch比通常的if/else相对较慢,因此不值得在所有情况下都使用它

一般来说,你应该两者都做。 尝试/捕获以避免异常情况(文件突然从
var startTime = DateTime.Now;
int bazillion = 100000000;
int[] list = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
for (int i = 0; i < bazillion; i++)
{
    for (int k = 0; k < list.Length; k++)
    {
        if (k >= 0)
        {
            list[k] = i;
        }
        else
        {
            // do nothing.
        }
    }
}
var executionTime = DateTime.Now - startTime;
Debug.WriteLine (executionTime.TotalMilliseconds);
var startTime = DateTime.Now;
int bazillion = 100000000;
int[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
for (int i = 0; i < bazillion; i++)
{
    for (int k = 0; k < list.Length; k++)
    {
        try
        {
            list[k] = i;
        }
        catch (Exception e)
        {
            // do nothing
        }
    }
}
var executionTime = DateTime.Now - startTime;
Debug.WriteLine(executionTime.TotalMilliseconds);
boolean isNumber(String input) {
    try {
        Integer.parseInt(input);
        return true;
    } catch (NumberFormatException) {
        return false;
    }
}
boolean isNotNull(Object o) {
    if (o != null) {
        return true;
    } else {
        return false;
    }
}
boolean isNotNull(Object o) {
    try {
        // Some operation of object to know it's not null
        o.hashCode();
        return true;
    } catch (NullPointerException e) {
        return false;
    }
}