C#-如何正确构造代码中的错误处理
我对编程相当陌生,我想知道构建错误处理的正确方法是什么。我在互联网上搜索过,但是我没有找到关于你所有try/catch/finally语句的结构以及它们之间如何相互作用的可靠信息 我想介绍一下我认为应该如何在代码中构造错误处理的想法,我想请大家检查一下这是否正确。一个巨大的好处是可以用一些其他的研究来支持它,这是某种常见的做法。 所以我这样做的方法就是把try语句放在几乎所有的地方!(我希望我的话没有激怒所有人)。PS-我也了解捕捉不同类型的异常,我只捕捉“Exception”类型只是为了解释 例如:C#-如何正确构造代码中的错误处理,c#,exception-handling,structure,C#,Exception Handling,Structure,我对编程相当陌生,我想知道构建错误处理的正确方法是什么。我在互联网上搜索过,但是我没有找到关于你所有try/catch/finally语句的结构以及它们之间如何相互作用的可靠信息 我想介绍一下我认为应该如何在代码中构造错误处理的想法,我想请大家检查一下这是否正确。一个巨大的好处是可以用一些其他的研究来支持它,这是某种常见的做法。 所以我这样做的方法就是把try语句放在几乎所有的地方!(我希望我的话没有激怒所有人)。PS-我也了解捕捉不同类型的异常,我只捕捉“Exception”类型只是为了解释
public class Program
{
static void Main (string[] args)
{
//I do not place simple code like below inside the try statement,
//because it is unnecessary and will slow the process down.
//Is this correct?
const int importantNumber = 45;
string name;
IRepositoryFactory repoFactory;
A a;
//And then I put code in 'try' where I feel it may go wrong.
try
{
a = new A();
a.AMethod1();
//Some other code
}
catch (Exception ex)
{
HandleError(ex);
}
}
}
// End of scope of Program! The functions below belong to their relative
// classes.
public void AMethod1()
{
try
{
B b = new B();
b.BMethod1();
}
catch (Exception ex)
{
//Preserving the original exception and giving more detailed feedback.
//Is this correct?
//Alternative - you still could do a normal 'throw' like in BMethod1.
throw new Exception("Something failed", ex);
}
}
public void BMethod1()
{
try
{
//some code
}
catch (Exception ex)
{
throw; //So I don't lose stack trace - Is this correct?
}
}
总之:
如果能提供一些资源来解释程序员应该如何组织他们的错误处理,我将不胜感激。请不要忘记阅读代码中的注释。根据我个人的经验,大多数异常都与空对象引用有关。我倾向于遵循空对象模式,以避免大量检查空值。而且在进行值转换时,我总是使用tryparse,这样就不会出现空值问题。总而言之,这个问题可以从许多角度来讨论。如果你能说得更具体一点,回答起来就容易了。以下是一些好的经验法则:
注:当我说“在那个级别”,我的意思是在单个类或方法中。除非异常处理是在增加值,否则不要包含它。它总是在用户界面级别增加价值,因为用户不必看到你的脏衣服,一条消息说“哦,洗衣日”就足够了。stackoverflow实际上不是一个意见网站。它主要针对特定问题的具体答案 但是您应该知道,
try…catch
确实有一些开销与之相关。把它放在“任何地方”都会影响代码的性能
只需使用它来包装易发生意外错误的代码,例如写入磁盘
还要注意,“正确”的方法取决于您如何处理这些错误。您是否记录它们、向用户报告它们、向调用者传播它们?这取决于。可能重复的
catch
块不是免费的。只有当您想对异常执行一些有用的操作(例如,在重新刷新它们之前记录它们)时,才应该捕获异常。否则,就让它们传播到调用者代码>可以重新抛出,抛出新异常(..)
可以添加更多信息和重新抛出。你唯一不想做的就是抛出ex代码>,这会吹走堆栈跟踪。同意安全编码可以解决许多问题。检查空值,尝试解析而不是解析(除非您收到的非数字字符串是一个异常,应该抛出该异常以显示开发人员出错?)。但这里的核心问题是关于异常处理模式的,你能不能进一步说:“一般来说,如果你抛出了与代码中相同的错误,这表明你不应该处理异常。故事结束”-不理解为什么这是一个问题。