【问题标题】:Why using try/catch if I can simply fix the error? [duplicate]如果我可以简单地修复错误,为什么还要使用 try/catch? [复制]
【发布时间】:2021-06-02 02:47:39
【问题描述】:

我不明白使用 try 和 catch 处理错误的意义。 (C#) 在我的在线课程中,使用了以下示例:

class Program
{
    static void Main(string[] args)
    {

        try
        {
            int[] numbers = new int[3];

            numbers[1] = 0;
            numbers[2] = 1;
            numbers[3] = 2;
            numbers[4] = 3;
        }
        catch(IndexOutOfRangeException ex)
        {
            Console.WriteLine(ex.Message);
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }


        Console.ReadKey();
    }
}

这是一个非常简单的例子,但我为什么要这样做呢?

我是新手...我正在学习 C# 编码...但我尝试以这种方式学习它,在最好的情况下不会发生任何错误。

为什么我会尝试捕获这样的异常而不是

run the programm -> "Ah there is a exeption" -> and then fix it?

【问题讨论】:

  • 好吧,如果你的程序在生产中运行,你不能修复它。因为它正在运行。因此,您可以告诉您的程序如何处理异常——例如,告诉用户他们的输入无效,或者重新启动连接——而不仅仅是......你知道的——崩溃。或者您可能希望自动记录异常,以便可以看到发生了什么,但用户不会被他们不理解的技术错误消息弄糊涂。
  • 你写是为了捕捉错误,所以当它们发生时你不会在这之后破坏你的部分代码。如果您想捕获 1 个错误并执行失败以外的操作(可能只是捕获它但继续),但您仍想捕获错误,您可以像示例中一样编写 2 catch。第二个可能会导致失败。你写它们是为了捕捉意想不到的东西,如果你知道每一个可能的结果/输入,那么你就不需要它,但这是不可能知道的。
  • 异常本质上是异常你有正确的心态,努力避免所有可以想象的异常,但是(我要补充)为不可预见的事件做好准备并尽量避免崩溃,如果可能的话。
  • 并非所有异常都是错误,可能是网络连接丢失或其他数百万个原因。通常你不希望你的程序崩溃。相反,您希望记录此错误并以易于理解的语言告知用户发生了什么以及他现在可以做什么。也许你还想实现一个retry-pattern

标签: c# try-catch


【解决方案1】:

首先是一个小点,在 C# 数组中是基于 0 索引的,这意味着你应该以 numbers[0] 开头。

在您的情况下,numbers[4] 将失败,但如果没有 try/catch,代码将立即停止。

大多数时候,您希望记录应用程序中发生的错误,因此这是 try/catch 机制的第一个可能(并且被广泛使用)的目的。

有时操作可能不足以停止程序。假设您要发送统计信息。如果无法发送统计信息(网络问题?),您不希望您的程序完全停止。

另一个需要更细粒度捕获的用例是重试机制。如果某些东西由于网络问题而崩溃,您可以在几秒钟后重试,但如果某些东西由于 IndexOutOfRangeException 而崩溃,这是一个会一次又一次发生的问题,所以甚至不需要重试(但您可能会记录它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2023-03-13
    • 2020-12-15
    • 2015-03-02
    • 2019-06-12
    • 2021-04-07
    • 2013-11-09
    相关资源
    最近更新 更多