【问题标题】:Method call on object does NOT throw exception对象上的方法调用不会引发异常
【发布时间】:2012-11-22 13:40:42
【问题描述】:

这些天我遇到many strange scenarios :-)

我在 ASP.Net 应用程序中测试了以下两个代码。当字符串值为空时,代码 1 抛出异常(如预期)而代码 2 不抛出异常(与预期相反)。

  1. 为什么“EVAL”在这种情况下不抛出异常?
  2. EVAL 会一直这样工作(即“没有例外”)还是只是运气?
  3. 是否有任何 MSDN 参考表明“Eval”返回空字符串?

//代码 1:导致异常

 string test = Convert.ToString(subscriber.EncryptedSSN).Substring(0, Convert.ToString(subscriber.EncryptedSSN).Length >= 5 ? 5 : Convert.ToString(subscriber.EncryptedSSN).Length);

// 代码2:不抛出异常

 <%# Convert.ToString(Eval("EncryptedSSN")).Substring(0, Convert.ToString(Eval("EncryptedSSN")).Length  >= 5 ? 5 : Convert.ToString(Eval("EncryptedSSN")).Length)  %>

参考文献:

  1. Eval check for DBNull doesnt work
  2. Convert.ToString behaves differently for "NULL object" and "NULL string"
  3. Datatype returned varies based on data in table

【问题讨论】:

  • 如果你能想出一个 shorter 的例子,那真的很有帮助——最好是在一个独立的控制台应用程序中。我不知道Eval 是什么,甚至 是 这里...
  • @JonSkeet 我添加了 ASP.Net 标签并更新了问题
  • 我强烈假设 Eval 返回 string.Empty 而不是 null。

标签: c# asp.net .net


【解决方案1】:

您的方案似乎不正确。第一个在 .NET 4 上对我来说没有例外:

object foo = null;

string test = Convert.ToString(foo).Substring(0, Convert.ToString(foo).Length >= 5 ? 5 : Convert.ToString(foo).Length);

这是因为Convert.ToString() returns "The string representation of value, or String.Empty if value is null"。

String.Empty 不为null,它是一个长度为0的字符串,所以在其上调用方法时不会抛出异常。

经过一番搜索,我找到了this page,它对 ASP 中的数据绑定进行了一般性解释,并解释了 “在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法”。 DataBinder.Eval() 返回一个对象,因此 Convert.ToString(Eval(Something)) 至少会返回 String.Empty,因此如果您尝试访问其结果的成员或属性,则不会抛出 NullReferenceException。

【讨论】:

  • 尝试使用“string foo”而不是“object foo”
  • @Lijo 这不是你所说的“奇怪的场景”,它是documented: "Convert.ToString(String) 返回指定的字符串实例;没有执行实际转换"我>。如果你传递null,它将返回null,因此会发生异常。既然你知道了这一点,我希望你能明白为什么会发生 NullReferenceException,你可以做些什么来防止它以及为什么 Eval() 不抛出异常(它必须返回一个非空字符串,或者一个非-字符串值或对象)。
  • 是否有任何 MSDN 参考表明 Eval 返回空字符串?
【解决方案2】:

您的Eval 评估为什么?也许它是 String.Empty 而不是 null,在这种情况下你不会得到异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2017-08-12
    相关资源
    最近更新 更多