【问题标题】:Current state object - C#当前状态对象 - C#
【发布时间】:2012-10-21 23:04:16
【问题描述】:

对于我当前的“试水”项目,我尝试不使用任何 Try-Catch 块,而是以其他方式捕获每个错误(致命错误除外)。

现在,当我说捕获错误时,我非常做作的程序会犯一个很容易避免的错误;它试图除以0,这可以通过 If 语句来防止。为了简单起见,我只有 1 个 C# 文件,有 1 个类和两种方法。我猜这就像一个模板,构造函数开始一个进程:

public class myObject
{
    public myObject()
    {
       Object objOne = methodOne();
       methodThree(objOne);
    }

    public object methodOne()
    {
        //logic to create a return object

        int x = 0;  

        //I've added a condition to ensure the maths is possible to avoid raising an exception when, for this example, it fails
        if (x > 0)
            int y = 5 / x;

        return object;
    }

    public void procesObjects(Object objOne)
    { 
        //logic  
    }    
}

所以,正如您在methodOne() 中看到的那样,我添加了if 语句以确保它检查数学没有除以0。但是,由于我已经抓住了它,我的申请会继续,这是不希望的。我需要一种方法来停止应用程序并记录调试失败。

所以,我认为这是可行的:

创建一个名为 Tracking 的类,对于本​​例来说,它非常简单(或者结构会更好吗?)。

public class Tracking
    {
        StringBuilder logMessage = new StringBuilder();
        bool readonly hasFailed;
    }

然后我可以将我的代码更新为:

public class myObject
{
    Tracking tracking = new Tracking();
    public myObject()
    {
       Object objOne = methodOne();
       if (!tracking.hasFailed)
           methodThree(objOne);
       if (tracking.hasFailed)
           ExteranlCallToLog(tracking);
    }
    public object methodOne()
    {
        //logic
        int x = 0;  
        //I've added a condition to ensure the maths is possible to avoid raising an exception when, for this example, it fails
        if (x > 0)
            int y = 5 / x;
        else
        {
            tracking.hasFailed = true;
            tracking.logMessage.AppendLine("Cannot divide by 0");
        }
         //may also need to check that the object is OK to return
        return object;
    }
    public void procesObjects(Object objOne)
    { 
        //logic  
    }    
}

所以,我希望你能看到我想要实现的目标,但我有 3 个问题。

  1. 我的跟踪对象(如本例所示)应该是类还是结构?
  2. 我担心我的代码会变得非常嘈杂。我想知道当系统发生故障时,它是否会在 Tracking 对象中引发一个事件,该事件记录然后以某种方式关闭程序会更好?
  3. 非常欢迎任何其他想法。

再次,我很欣赏使用 Try-Catch 块可能更简单、更容易,但我故意避免使用它们以供我自己学习。

编辑

上述原因是由于阅读了这篇博客:Vexing exceptions - Fabulous Adventures In Coding - Site Home - MSDN Blogs

【问题讨论】:

  • 为什么?那没有意义。在您的代码中使用 Try-Catch 是正常的。没有理由不使用它。
  • 只是因为我读了一篇博客,上面说尽可能不要使用它们。但是,不使用它们意味着我必须设计另一种方法来提醒程序出现问题。
  • 戴夫,我完全同意关于简单事物的博文。你永远不应该使用异常处理来做像 int.Parse 这样简单的事情。当您遇到通常异常的事情时,抛出一个是完全有效的;)
  • @DaveRook 你误解了这篇文章。不要从字面上理解。异常仍然是控制应用程序流的有价值的方法。这篇文章是说不要不必要地引入可能引发异常的代码。并且不要尝试在任何地方处理异常。在整个应用程序中应该只有少数地方处理异常。
  • 感谢 Paul 和 Euphoric;虽然我会尝试去迎合一些事情,但当它影响到节目的结果时我不会!谢谢你的建议,这很棒,也是我需要的。谢谢。

标签: c# error-handling try-catch


【解决方案1】:

说真的,Dave - try catch 块的存在是有原因的。使用它们。

从字里行间看,您似乎想在出现问题时跟踪自定义信息。您是否考虑过扩展 System.Exception 以创建适合您需求的定制实现?

类似的东西:-

public class TrackingException : System.Exception 
{
   // put custom properties here.
}

这样,当您检测到出现问题时,您仍然可以使用 try/catch 处理,但会抛出包含您需要的相关信息的异常。

【讨论】:

  • 真是个好主意。这样做的原因是因为我读了一篇博客,上面说尽量不要使用它们:blogs.msdn.com/b/ericlippert/archive/2008/09/10/…
  • @DaveRook Eric 在他的博客文章中说,不应捕获除零和类似异常,但这并不意味着您应该检查值并手动失败。这意味着您应该防止该值变为零。例如,当您从用户那里读取值时,拒绝零并提示新输入等。
  • @codesparkle 谢谢,我完全错过了这一点。谢谢。
猜你喜欢
  • 2011-04-14
  • 2012-11-24
  • 2012-07-14
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 2016-09-19
相关资源
最近更新 更多