为了账号安全,请及时绑定邮箱和手机立即绑定

主要方法代码完全在try / catch内:这是不好的做法吗?

主要方法代码完全在try / catch内:这是不好的做法吗?

C#
SMILET 2019-12-03 16:04:06
通常,我将所有Main方法的代码都放在try / catch块中,如下所示:public static void Main(string[] args){   try   {      // code   }   catch (Exception e)   {      // code   }}我这样做是为了防止任何异常设法从程序逻辑的其余部分滑出,从而使我可以做一些事情,例如将其显示在控制台上,将其记录到文件中,等等。但是,有人告诉我这是不好的做法。您认为这是不好的做法吗?
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

在没有充分理由的情况下将任何代码包装在try/ catch块中都是不好的做法。


在.NET编程模型中,应为真正的例外情况或条件保留例外。您应该仅尝试捕获实际上可以执行某些操作的异常。此外,你应该应该很难永远抓住基础System.Exception类(而是更愿意搭上更具体的,你得到的异常类可以办理)。而且,如果在程序执行过程中遇到真正意外的异常,您实际上应该崩溃。


显然,“正确”的答案必须根据具体情况而定,具体取决于块中该// code占位符内部的情况catch。但是,如果您要寻求一般规则或“最佳实践”,则应该始终有捕获异常的特定原因,而不是理所当然地不只是将所有代码包装在一个大的try/ catch块中。


请注意,如果您只是试图捕获可能出于记录或错误报告目的而发生的任何未处理的异常,则应使用AppDomain.UnhandledExceptionevent。这是一个仅通知事件,因此不允许您处理这些异常,但是在应用程序崩溃后,它是实现日志记录或错误报告功能的正确位置。


编辑:当我赶上阅读雷蒙德·陈(Raymond Chen)出色的博客“旧事物”时,我注意到他最近发表了一篇有关类似主题的文章。它特定于COM,而不是.NET Framework,但有关错误处理的一般概念同样适用于两种环境。我以为我在这篇文章中可以分享一些宝石,以支持我的[显然颇有争议的]观点。


从历史上看,COM围绕服务器的方法进行了巨大的尝试/例外。如果您的服务器遇到通常是未处理的异常,巨型try / except将捕获该异常并将其变为error RPC_E_SERVERFAULT。然后将异常标记为已处理,从而使服务器保持运行状态,从而“即使遇到问题也可以通过保持服务器运行状态来提高鲁棒性”。


提醒您,这实际上是一种伤害。


发生未处理的异常的事实意味着服务器处于意外状态。通过捕获异常并说“不用担心,这一切都很好”,您最终使损坏的服务器处于运行状态。


[。。。]


捕获所有异常并让进程继续运行,假定服务器可以从意外故障中恢复。但这是荒谬的。您已经知道服务器是无法恢复的吐司:它崩溃了!


更好的方法是让服务器崩溃,以便可以在故障点捕获崩溃转储。现在,您将有很大的机会了解正在发生的事情。


您可以[并且应该]在他的博客上阅读整篇文章:如何关闭COM“有帮助地”包装在服务器周围的异常处理程序。


查看完整回答
反对 回复 2019-12-03
?
狐的传说

TA贡献1804条经验 获得超3个赞

如果您正在做最聪明的事情,可以使用此错误,那是个好习惯。这就是try / catch的目的。

如果您只是丢掉错误(或将其记录并丢掉)-尤其是无论异常类型如何,都将其视为错误的做法。

这可能会引发一个问题:如果最聪明的事情是将其记录并丢弃该怎么办?我想说的是例外。但实际上,我的代码会断言。我想我沉迷于许多不良做法。


查看完整回答
反对 回复 2019-12-03
?
温温酱

TA贡献1752条经验 获得超4个赞

我同意科迪所说的90%。在某些情况下,类似于pluggin示例,您可能想捕获系统异常。这是考虑使用WCF Web服务的另一个示例。


目标:即使遇到错误,也要使用服务并进行处理。让错误冒泡。


public static bool DoRemoteWebServiceWork()

{

    bool result;

    RemoteWebServiceClient client = new RemoteWebServiceClient();

    try

    {

        result = client.DoWork();

        client.Close();

    }

    catch (Exception)

    {

        client.Abort(); //dispose

        throw;//This service is critical to application function. The application should break if an exception is thrown.

        //could log end point and binding exceptions to avoid ignoring changes to the remote service that require updates to our code.

    }

    return result;

}

目标:即使遇到错误,也要使用服务并进行处理。防止错误冒泡。


public static bool DoRemoteWebServiceWork()

{

    bool result;

    RemoteWebServiceClient client = new RemoteWebServiceClient();

    try

    {

        result = client.DoWork();

        client.Close();

    }

    catch (Exception)

    {

        client.Abort(); //dispose

        //throw; //This service is auxiliary to the applications primary function. We have no influence over the service and therefore cannot fix it.

        //could log end point and binding exceptions to avoid ignoring changes to the remote service that require updates to our code.

    }

    return result;

}


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 651 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信