在C#中你可以从main返回一个默认的int值吗?

时间:2013-04-24 15:49:14

标签: c#

我想从main返回一个默认的int值。

请考虑以下事项:

using System;
class Class1
{
    static int Main(string[] args)
    {
        int intReturnCode = 1;
        int intRandNumber;

        Random myRandom = new Random();
        intRandNumber = myRandom.Next(0,2);
        if(intRandNumber ==1)
        {
            throw new Exception("ErrorError");      
        }
        return intReturnCode;
    }
}

当达到异常时,我无法设置返回码。

是否可以在main中包含默认返回码?

澄清:我有一个程序正在抛出未处理的异常。我在try catch中有应用程序,但是一些错误(可能是内存不足,stackoverflow等)仍在冒泡并导致我的应用程序在生产中失败。

为了解决这个问题,我添加了代码来捕获未处理的异常。

这已被添加到main:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);

现在我有一个未处理的异常发生时达到的方法。

public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)   
{ 
    //here's how you get the exception  

    Exception exception = (Exception)e.ExceptionObject;                 

    //bail out in a tidy way and perform your logging
}

问题在于我不再使用Main,我想退出非零退出代码。

4 个答案:

答案 0 :(得分:5)

未处理的异常是实现定义的行为。任何事情都可能发生; CLR可以决定在它认为合适时设置进程的返回代码,它可以启动调试器,它可以做任何想做的事情。您不能依赖任何包含未处理异常的程序的任何行为。

如果您希望具有可预测的行为,例如确定流程结束时返回代码的内容,则必须总共有未处理的异常。

如果你有第三方组件抛出未处理的内存异常,那么最好的办法是:修复该组件中的错误。如果你不能这样做,那么将组件隔离到它自己的进程或它自己的appdomain

答案 1 :(得分:4)

问题是你为什么要在main中抛出异常,而不是提供表示错误的返回码?而不是你正在做什么,我的代码将如下所示:

static int Main(string[] args)
{
    int intRandNumber;

    try
    {
        Random myRandom = new Random();
        intRandNumber = myRandom.Next(0,2);
        if(intRandNumber ==1)
        {
            Console.WriteLine("Got invalid random number!");
            return 0;
        }
    }
    catch (Exception exp)
    {
        Console.WriteLine("Strange ... an error occurred! " + exp.ToString());
        return -1;
    }

    return 1;
}

根据经验,你不应该抛出异常来控制程序流程。如果可以的话,处理像 oops这样的条件,我输错了数字而没有抛出异常。

答案 2 :(得分:3)

在主线程中抛出异常会在没有到达return的情况下结束执行:当你得到“控制台应用程序已经停止工作时,你想调试吗?”来自操作系统的对话框。 <{1}}在这些条件下无法返回任何内容,因为没有任何东西可以返回。

如果您想在收到异常时返回某些内容,请按以下方式对您的程序进行编码:

Main

答案 3 :(得分:0)

捕获您的异常并在finally块

中设置return语句
using System;
class Class1
{
    static int Main(string[] args)
    {
        try
        {
            int intReturnCode = 1;
            int intRandNumber;

            Random myRandom = new Random();
            intRandNumber = myRandom.Next(0,2);
            if(intRandNumber ==1)
            {
                throw new Exception("ErrorError");      
            }
        }
        catch(Exception e)
        {
          // ...
        }
        finally
        {
            return intReturnCode;
        }
    }
}