Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果DateTime类型函数中发生任何异常,应该返回什么?_C#_.net - Fatal编程技术网

C# 如果DateTime类型函数中发生任何异常,应该返回什么?

C# 如果DateTime类型函数中发生任何异常,应该返回什么?,c#,.net,C#,.net,这是相同的代码。我在catch块中出错,因为我想知道可以返回什么 public static DateTime ToDate(this object val) { try { return Convert.ToDateTime(val); } catch { return ; } } 您可以使用类似的DateTime.MaxValue(或MinValue),也可以返回null(只要将签名更改为DateTime?(可

这是相同的代码。我在catch块中出错,因为我想知道可以返回什么

public static DateTime ToDate(this object val)
{
    try
    {
       return Convert.ToDateTime(val);
    }
    catch 
    {
        return ;
    }
}

您可以使用类似的DateTime.MaxValue(或MinValue),也可以返回null(只要将签名更改为DateTime?(可为null的DateTime)

您不应该使用异常处理来尝试强制转换到
DateTime
。如果转换失败,请使用
DateTime.TryParse
并返回
Nullable

例如:

public static DateTime? ToDate(this object val, IFormatProvider formatProvider = null)
{
    if(val ==  null) return null;
    if(val is DateTime) return (DateTime) val;
    if(val is DateTime?) return (DateTime?) val;
    if(formatProvider == null) formatProvider = System.Globalization.DateTimeFormatInfo.CurrentInfo;

    string dateStr = val.ToString();
    DateTime dt;
    if(DateTime.TryParse(dateStr, formatProvider, System.Globalization.DateTimeStyles.None, out dt))
        return dt;
    return null;
}
现在,您可以区分有效的
DateTime
和无法解析的日期时间:

object dtObj = "2016-02-11";
DateTime? dtorNot = dtObj.ToDate(); // valid,  dtorNot.Value contains the DateTime
dtObj = "foo";
dtorNot = dtObj.ToDate();          // invalid, dtorNot.HasValue == false

在这种情况下,返回值应该是显而易见的


如果没有明显的值,那么您在错误的位置处理异常。或者,您应该捕获该异常并抛出另一种类型。

为什么不抛出异常?如果出现问题,请修复它。您不想处理异常?不要使用try-catch,而是使用
DateTime.TryParse
and如果转换失败,返回
DateTime?
。这完全是上下文特定的。有时你真的想忽略坏数据,有时你应该立即停止。我们不知道。问题是:我们当然没有上下文来决定应该在这里返回什么。我想你可能也没有,在这个时候因此,正确的答案是:抛出异常,让知道上下文的更高级别的代码来决定。