C# 例外情况:何时使用、计时、整体使用

C# 例外情况:何时使用、计时、整体使用,c#,.net,exception,overuse,C#,.net,Exception,Overuse,我会试着问我的问题,这样它就不会以一条简单的辩论线索结束 最近我跳进了一个用C编写的应用程序,我发现了异常机制。我和他们有过一些不好的经历,比如 // _sValue is a string try { return float.Parse(_sValue); } catch { return 0; } 我把它改成: float l_fParsedValue = 0.0f; if (float.TryParse(_sValue, out l_fParsedValue)) {

我会试着问我的问题,这样它就不会以一条简单的辩论线索结束

最近我跳进了一个用C编写的应用程序,我发现了异常机制。我和他们有过一些不好的经历,比如

// _sValue is a string
try
{
    return float.Parse(_sValue);
}
catch
{
    return 0;
}
我把它改成:

float l_fParsedValue = 0.0f;
if (float.TryParse(_sValue, out l_fParsedValue))
{
    return l_fParsedValue;
}
else
{
    return 0;
}
结果,我在VisualStudio中的输出不再充斥着这样的消息

First chance System.FormatException blabla

当类似于“-”的字符串到达代码段时。我认为使用第二个片段更简洁

更进一步说,我经常看到异常被频繁使用,比如:在这个try-catch中,我想做什么就做什么,如果出了什么问题,就去catch

现在,为了不被坏的误解所困扰,我希望你们能帮助我清楚地定义如何/何时使用这些例外,以及何时坚持旧的观点,如果……否则


提前感谢您的帮助

在异常情况下应该抛出异常。i、 当意想不到的事情发生时。如果您希望函数定期抛出异常,那么这很可能是糟糕的设计

在您的示例中,很明显,TryParse更好,因为异常似乎经常发生

但例如,在解析文件时,我希望它几乎总是有效的。因此,我通常使用Parse和catch异常,生成InvalidDataException,将捕获的异常作为内部异常。通常会大大简化解析代码,即使它的风格可能不好


我推荐Eric Lippers的博客条目:

在异常情况下,您应该抛出异常。i、 当意想不到的事情发生时。如果您希望函数定期抛出异常,那么这很可能是糟糕的设计

在您的示例中,很明显,TryParse更好,因为异常似乎经常发生

但例如,在解析文件时,我希望它几乎总是有效的。因此,我通常使用Parse和catch异常,生成InvalidDataException,将捕获的异常作为内部异常。通常会大大简化解析代码,即使它的风格可能不好


我推荐Eric Lippers的博客:

在Parse/TryParse情况下,最好不要等待异常,使用TryParse并自行处理错误输入。

在Parse/TryParse情况下,最好不要等待异常,使用TryParse并自行处理错误输入。

异常应用于异常行为,不适用于流量控制。一个基本的指导原则是,如果正常的程序流经常遇到异常,那么您就做错了


然而,重要的是要注意,仅仅有一个try{}catch{}出现本身不会对性能产生负面影响。只有在实际抛出异常并且需要计算堆栈跟踪时,您才会在某些情况下看到相当严重的性能降级

异常应用于异常行为,而不是流控制。一个基本的指导原则是,如果正常的程序流经常遇到异常,那么您就做错了


然而,重要的是要注意,仅仅有一个try{}catch{}出现本身不会对性能产生负面影响。只有在实际抛出异常并且需要计算堆栈跟踪时,您才会在某些情况下看到相当严重的性能降级

啊,要是这么简单就好了!但是,唉,何时使用异常的决定往往是主观的。尽管如此,还是有一些指导方针可以使用。例如

总之,抛出异常的经验法则是——只有当函数不能执行它应该执行的操作时,才抛出异常。基本上每个函数都有一个契约——它有一个输入值的合法范围和一个输出值的合法范围。当输入值无效或无法提供预期的输出值时,应引发异常

请注意,这里有一个棘手的问题——用户输入错误的验证是否也应该作为异常抛出?有些学派说不包括微软,有些则说是。你的电话。每种方法都有其优缺点,如何构造代码由您自己决定


捕捉异常的经验法则是——您应该只捕捉可以处理的异常。现在,这也很滑。向用户显示错误消息是否也在处理它?但如果是臭名昭著的StackOverflowException或OutOfMemoryException呢?你几乎不能展示任何东西。而且,这些可能不是使整个系统处于不可用状态的唯一例外。再说一遍——你的电话。

啊,要是这么简单就好了!但是,唉,何时使用异常的决定往往是主观的。尽管如此,还是有一些指导方针可以使用。例如

总之,抛出异常的经验法则是——只有当函数不能执行它所支持的操作时,才抛出异常 我不知道该怎么做。基本上每个函数都有一个契约——它有一个输入值的合法范围和一个输出值的合法范围。当输入值无效或无法提供预期的输出值时,应引发异常

请注意,这里有一个棘手的问题——用户输入错误的验证是否也应该作为异常抛出?有些学派说不包括微软,有些则说是。你的电话。每种方法都有其优缺点,如何构造代码由您自己决定


捕捉异常的经验法则是——您应该只捕捉可以处理的异常。现在,这也很滑。向用户显示错误消息是否也在处理它?但如果是臭名昭著的StackOverflowException或OutOfMemoryException呢?你几乎不能展示任何东西。而且,这些可能不是使整个系统处于不可用状态的唯一例外。同样,你的电话。

到目前为止,另一个尚未深入研究的问题是,异常会带来成本。它们破坏了程序中正常的控制流,因此会占用一些资源

一个简单的测试是编写一个在原始float上循环的程序。用一些无效数据解析代码,并比较它与TryParse版本运行所需的时间——会有一个很小但明显的区别

在做出异常决策时,我脑海中的一个片段来自:

几乎是规则1

当你决定是否应该扔 例外情况下,假装 语句使计算机发出哔哔声3 三次,然后睡2秒钟。如果 你还想把它扔下去吗 环境,去吧


另一个到目前为止还没有被深入研究的问题是,例外是有代价的。它们破坏了程序中正常的控制流,因此会占用一些资源

一个简单的测试是编写一个在原始float上循环的程序。用一些无效数据解析代码,并比较它与TryParse版本运行所需的时间——会有一个很小但明显的区别

在做出异常决策时,我脑海中的一个片段来自:

几乎是规则1

当你决定是否应该扔 例外情况下,假装 语句使计算机发出哔哔声3 三次,然后睡2秒钟。如果 你还想把它扔下去吗 环境,去吧

使用异常作为一部分的程序 他们的正常处理能力受到影响 所有的可读性和 经典系统的维修性问题 意大利面代码

-安迪·亨特和戴夫·托马斯

关于如何/何时使用异常,我认为没有简单正确的答案。这取决于您正在使用的应用程序的体系结构和其他因素

我可以建议你阅读这本书的章节和章节

使用异常作为一部分的程序 他们的正常处理能力受到影响 所有的可读性和 经典系统的维修性问题 意大利面代码

-安迪·亨特和戴夫·托马斯

关于如何/何时使用异常,我认为没有简单正确的答案。这取决于您正在使用的应用程序的体系结构和其他因素


我可以建议您阅读本书的章节和章节。

谢谢,我认为在应用程序的某个阶段,由于事件的堆积,性能可能会被浪费!谢谢,我认为在应用程序的某个时刻,由于事件堆栈,性能可能会被浪费!