C#中是谁调用Main()方法?在Main()方法中出现异常时如何退出应用程序?

3

我在看一些其他问题时,想到了这个问题:

  1. 谁调用Main()方法?
  2. 如果我想退出/终止应用程序(当在Main()方法中出现异常),是否可以从Main()方法的catch块使用return;语句好?

    • 请注意我没有在Main()方法中显式地启动任何线程。当我们启动应用程序时,是否会自动启动任何线程?
    • Application.Exit()不能保证应用程序退出
    • (编辑点) Environment.Exit()是另一种选择。

使用return;语句来退出应用程序是否是个好主意? 如果不是,有哪些(微妙的)因素可能导致它不是个好主意?

相比之下,什么是最好的退出方式?

5个回答

2
如果您的应用程序由于意外错误而终止,您可能希望使用Environment.FailFast,它将“崩溃”应用程序,并写入事件日志中指定的消息,并为用户提供提交崩溃数据给Microsoft的机会。作为开发人员,Microsoft可以向您提供崩溃数据。
但是,如果您只想将错误条件返回给调用进程(例如在控制台应用程序的情况下),则可以修改Main方法签名以返回int,然后返回非零值,该值根据惯例意味着错误条件。

2
哇,我用 C# 已经十年了,居然不知道你可以更改方法签名。 - Charles Lambert

1

Application.Exit()适用于基于窗体的应用程序。在Main中处理异常的最佳方法是:

static void Main(string[] args) {
    try {
        // code here
    } catch {
        // do any clean up and return

        // optionally specify an exit code
        Environment.Exit(1 /* or any number other than zero since this is an error condition */);
    }
}

哎呀!被人莫名其妙地踩了一下,却没有任何解释。真是太有帮助了。 - Charles Lambert
最好还是提供下投票反对的原因! - Learner
是的,仅仅因为回答有明显的问题而进行恶意投票并不好。我必须发出平衡的赞成票。 - Josh

1
谁调用Main()方法?
CLR
如果我想退出/关闭应用程序(当我在Main()方法本身中遇到一些异常时),从catch块中使用return;语句是一个好主意吗?
是的,但要注意您是否有其他前台线程。

谢谢您的回复。我想当您发布答案时,我正在编辑问题。顺便问一下,当我们启动应用程序时,是否会自动在后台/前台启动任何线程? - Learner

1

你可以在Main()的周围放置一个巨大的try/catch块,或者设置AppDomain.UnhandledException事件。这与直接相关无关,但请看Environment.Exit,你对Application.Exit是正确的,因为它只是关闭所有窗口。Environment.Exit还允许您指定一个值作为退出状态(错误级别),如果您声明了void Main()而不是int Main()


0

1) 操作系统基本上调用Main方法。其启动地址在.exe文件的PE头中指定(如果我没记错的话)。

2) 是的,在catch块中使用return语句。


1
但在.NET中,情况就更加复杂了,因为程序集必须首先进行JIT编译。CLR实际上会调用Main方法。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接