例外问题

时间:2011-07-11 12:00:47

标签: c# asp.net performance exception exception-handling

一直以来,为了避免任何运行时错误,我使用Exception处理程序:

如下:

try
{
    //My code which may raise an error.
}
catch (Exception ee)
{
            string message = ee.Message;
            ShowMessage();
} 

我的问题是:

  1. 这被视为良好做法还是不良做法? (我使用相同的

  2. 每次声明字符串时性能问题怎么样?

  3. 使用带有返回值的方法的那些行时, 返回必须在捕获后?

7 个答案:

答案 0 :(得分:6)

这是糟糕的代码。实际上非常坏。

由于您对错误消息所做的只是将其分配给您从未使用过的字符串,因此您实际上只是捕获异常并忽略它。对于异常,这几乎是最糟糕的事情,因为程序将继续运行,好像什么也没发生,可能是数据不可用或损坏。

捕捉异常时:

  • 使用更具体的异常类型,例如SqlException或IOException,以便您只捕获要捕获的异常,并且知道如何处理。

  • 捕获异常时,要么真正处理它,要么重新抛出它以便可以在不同的级别处理它。

答案 1 :(得分:4)

您应首先处理已知问题以提高性能,例如空引用,空字符串等。

例外案例使用例外。

声明string并不是坏事,但除了持有另一个参考之外,它没有做任何事情。

您可以安全地从try块返回。但正如Damokles所述,你还应该在其他地方再次回归。

答案 2 :(得分:1)

您应该只捕获您期望的异常并知道如何处理它们。通过catch (Exception),您正在捕捉方法中的所有异常并不是一种好的做法。

您可以捕获所有异常,只需记录它们或在失败时重新启动应用程序。

例如

try
{
    //My code which may raise an error.
}
catch (FileNotFoundException)//you are expecting this exception
{
    //handle file not found here.
}
catch (Exception ee)
{
    string message = ee.Message;
    Log(message);
    throw;//rethrow the exception
} 

答案 3 :(得分:1)

无需在所有函数中添加异常处理程序。在main()处添加异常处理,它包装了所有函数。仅在您打算执行某些特定异常处理操作的位置添加异常处理程序,以防止应用程序崩溃。

可以在try块中添加返回值。

答案 4 :(得分:1)

我假设您正在对IGNORE例外做这件事吗?在这种情况下,您可以这样做:

try
{
// code
}
catch {} 

这将捕获所有异常并对它们不执行任何操作(忽略)。

但我不建议这样做,因为您现在永远不会知道为什么系统中的某些功能无法按预期工作,因为不会抛出任何错误。然后,我会建议至少LOG日志异常,以便您以后可以解决问题。更好的方法是记录异常并重新抛出它,然后在UI层进行友好的异常处理。

答案 5 :(得分:1)

这被视为不良做法,因为您基本上忽略了该异常。您甚至不向用户显示它!

这甚至是双坏的,因为在你的代码中复制粘贴相同的行也是一种不好的做法。

推荐用法是处理例外,或根本不触及。由于代码知道如何处理异常的情况并不常见,因此常见的情况是根本无法捕获它!

当然,在你的主循环中,你将有一个try-catch,它将记录异常和/或向用户报告异常。

关于你的第二个问题:是的,一个return语句可以成为catch块的一部分。但如果你不知道该返回什么,你就不应该抓住这个例外!

答案 6 :(得分:1)

异常处理的一般结构如下:

try
{
    //do struff here
}
catch (...)
{
    //handle exception here
}
finally
{
    //clean up here
}

您的代码中有一些注意事项并不完全正确(实际上它们很糟糕:p):

  1. 只捕获您准备处理的异常,而不处理您不能处理的异常。这意味着您应该只捕获在特殊情况下可以发生的特定异常(FileNotFoundExceptionArgumentOutOfRangeException,等等)(永远不要将异常处理用作正常的执行流工具) )。捕获System.Exception被认为是不好的做法(除非它是用于记录目的而你后来throw;),因为这个exception可能会被任何有害的东西抛出,这很可能是你没有预见到的在编写代码时,因此不知道如何正确处理它。

  2. 根据您的情况,您应该考虑使用finally块来清除退出方法之前的任何内容(因为正常的执行流程或未处理的异常)。请注意,finally块将在(通常)退出方法范围之前始终执行。

  3. 不要吞下异常及其包含的信息。您应该考虑将其记录到某处(myApplication.log文件)并向用户显示更友好的“我们有aproblem”消息。否则,在生产中出现错误时,您将获得的唯一信息将是您向用户显示的任何信息。存储在已捕获的exception中的所有有价值信息都将丢失。