c# - 当前状态对象 - C#

标签 c# error-handling try-catch

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

现在,当我说捕获错误时,我非常做作的程序会犯一个很容易避免的错误;它试图除以 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 个问题。
  • 我的跟踪对象(如本例所示)应该是类还是结构?
  • 我担心我的代码会变得非常嘈杂。我想知道当系统发生故障时,它是否会在 Tracking 中引发一个事件记录然后以某种方式关闭程序的对象会更好吗?
  • 任何其他想法都非常受欢迎。

  • 同样,我很欣赏使用 Try-Catch block 可能更简单、更容易,但我故意避免使用它们来进行自己的教育。

    编辑

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

    最佳答案

    说真的,戴夫——try catch block 的存在是有原因的。使用它们。

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

    类似于以下内容:-

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

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

    关于c# - 当前状态对象 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175735/

    相关文章:

    c# - 如何给出有空间的枚举值

    c# 代码改进(数组、列表)

    c# - 将 Json.Net JValue 转换为 int

    php - 尝试不使用 Stripe 充电

    c# - 从 C# 发布到我的 Facebook 时间线

    asp.net - 有关处理Web服务中的错误/异常的提示

    html - 删除隐藏元素和表单提交之间的空间

    cakephp - 在 CakePHP 中重定向到维护页面不起作用

    php - 如何在 PHP 中捕获 require() 或 include() 的错误?

    java - 变量可能未从扫描仪初始化?