对于我目前的“试水”项目,我试图不使用任何 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
which 对于这个例子来说非常简单的类(或者结构会更好吗?)。
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 块可能更简单、更容易,但我故意避免使用它们来进行自己的教育。
编辑
上面的原因是由于阅读了这篇博客:Vexing exceptions - Fabulous Adventures In Coding - Site Home - MSDN Blogs