一直以来,为了避免任何运行时错误,我使用Exception处理程序:
如下:
try
{
//My code which may raise an error.
}
catch (Exception ee)
{
string message = ee.Message;
ShowMessage();
}
我的问题是:
这被视为良好做法还是不良做法? (我使用相同的
每次声明字符串时性能问题怎么样?
当使用带有返回值的方法的那些行时, 返回必须在捕获后?
答案 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):
只捕获您准备处理的异常,而不处理您不能处理的异常。这意味着您应该只捕获在特殊情况下可以发生的特定异常(FileNotFoundException
,ArgumentOutOfRangeException
,等等)(永远不要将异常处理用作正常的执行流工具) )。捕获System.Exception
被认为是不好的做法(除非它是用于记录目的而你后来throw;
),因为这个exception
可能会被任何有害的东西抛出,这很可能是你没有预见到的在编写代码时,因此不知道如何正确处理它。
根据您的情况,您应该考虑使用finally
块来清除退出方法之前的任何内容(因为正常的执行流程或未处理的异常)。请注意,finally
块将在(通常)退出方法范围之前始终执行。
不要吞下异常及其包含的信息。您应该考虑将其记录到某处(myApplication.log文件)并向用户显示更友好的“我们有aproblem”消息。否则,在生产中出现错误时,您将获得的唯一信息将是您向用户显示的任何信息。存储在已捕获的exception
中的所有有价值信息都将丢失。