我想从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,我想退出非零退出代码。
答案 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;
}
}
}