当前状态对象 - C#

时间:2012-11-01 11:06:52

标签: c# error-handling try-catch

对于我目前的'测试水域'项目,我试图不使用任何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. 非常欢迎任何其他想法。
  4. 同样,我很欣赏它可能更简单,更容易使用Try-Catch块,但我故意试图避免它们用于我自己的教育。

    修改

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

1 个答案:

答案 0 :(得分:4)

说真的,Dave - 尝试捕获块是有原因的。使用它们。

在行之间阅读,看起来您想要在出现问题时跟踪自定义信息。您是否考虑过扩展System.Exception来创建适合您需求的定制实现?

以下内容: -

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

这样,当您检测到某些内容出错时,您仍然可以使用try / catch处理,但会抛出包含相关信息的异常。