如何重新引发异常并在c#中返回值?

如何重新引发异常并在c#中返回值?,c#,exception,C#,Exception,给定以下代码,如果引发异常,如何返回一些值(DateTime.Now.ToString()) public string DateToString(int year, int month, int day) { try { DateTime datetime = new DateTime(year, month, day); return datetime.ToString(); } catch (Exception) {

给定以下代码,如果引发异常,如何返回一些值(DateTime.Now.ToString())

public string DateToString(int year, int month, int day)
{
    try
    {
        DateTime datetime = new DateTime(year, month, day);
        return datetime.ToString();
    }
    catch (Exception)
    {
        //log error and rethrow
        throw;
    }
}

当您抛出异常时,您的方法立即结束。
也无法返回值

当您调用引发异常的方法时,控制将立即转移到
catch
块。
您将没有机会观察或使用(不存在的)返回值


你应该重新考虑你的设计。

想想抛出异常实际上意味着什么。如果你的函数返回一个值,你可能想在某个地方使用它,对吗

比如:


如果您希望在上述异常情况下
DateToString
返回一个值,那么您希望将该值分配给
dateString
,对吗?但是,对于例外情况,您想做什么呢?你要么继续,要么不继续;你不能两全其美。

编辑:cyberkiwi比我更了解这个问题,但我会让它成为阅读的坏榜样;)


您始终可以定义自己的异常类:

[Serializable()]
public class OwnException : System.Exception
{
    public readonly MaybeDateTime;

    ...
    public OwnException (string message, System.Exception inner) :  base(message, inner) { maybe = null; }
    public OwnException (string message, System.Exception inner, DateTime maybe) :  base(message, inner) { MaybeDateTime = maybe; }
}
然后抛出这个(分配日期时间)

您必须将DateTime-DateTime声明转移到try-catch块之外,在您的示例中SLaks是正确的:这没有意义。只有当return语句抛出捕获的异常时,datetime才能保存有意义的内容。在其他情况下,可能会有有用的应用程序


编辑:字符串也可以这样做,但是如果返回当前时间以一种好的方式解决了问题,那么将其作为一个异常重新引用将有点愚蠢。如上所述,没有正确阅读。

我认为你的问题措辞错误。看起来您只是希望在异常时返回一个默认值。所以

public string DateToString(int year, int month, int day)
{
    try
    {
        DateTime datetime = new DateTime(year, month, day);
        return datetime.ToString();
    }
    catch (Exception exObj)
    {
        //log error
        LogMyError(exObj);
        return DateTime.Now.ToString();
    }
}

我建议您这样做:

    bool IsValidDateTime(int year, int month, int day, out DateTime result)
    {
        try
        {
            result = new DateTime(year, month, day);
            return true;
        }
        catch (System.Exception ex)
        {
            result = DateTime.Now; // assign a value
            return false;
        }
    }
如果需要字符串,只需确保返回值为true并调用

 result.ToString();

如问题所述,无需观察/使用返回值(在try代码路径中)如果无需使用返回值,为什么要返回它?只需重新抛出异常。如果您真的需要它,您可以创建自己的包装器异常,它有两个参数,真正的异常和所需的返回值,但这太可怕了。@Michael-请重新阅读我的评论。我的意思是,如果失败,则不需要使用try部分返回的
。我将这个问题解释为“如果参数对形成日期无效”->return datetime.now“我认为重新抛出错误部分是无关的,因为我认为@IanM希望返回当前日期时间[datetime.now.ToString()],而不是datetime实例的值[在try块中]不。您应该返回一个
DateTime?
。DateTime不是一个可为空的类型。那么您如何知道它是一个“无效”值呢?您当然可以让异常ocurr并让调用方处理它。但是如果您要验证用户输入,我认为最好使用TryParse模式进行验证。添加
会导致
DateTime
转换为可空类型。这就是
的意思。“语法
T?
nullable
的缩写,其中
T
是一种值类型。这两种形式是可互换的。”哦,天哪……我怎么会错过这个。谢谢你提出它!!
 result.ToString();