0

我在某处读到,永远不应该将错误条件用作正常的程序流程。对我来说很有意义......但是

位于 MySQL 数据库之上的 C# 应用程序。我需要将一个字符串值解析为两部分,一个 ID 和一个值。(原始数据来自泥盆纪数据库),然后根据查找表验证该值。因此,一些原始字符串可能如下所示:

《6776紫食人》

“BIK 黄色波点比基尼(正在使用中)”

“DCP平分政变”

所以,我的小工具根据第一个空格的索引(幸运的是,一致)将每个字符串解析为 ID 和描述。然后我将 ID 传递给查找,获取新值,然后我们就走了。

不幸的是,TPTB 还决定我们不再需要臭黄色波点比基尼(目前正在使用)。因此,BIK 不会返回一行。这是一个代码片段:

    foreach (string product in productTokens) {
      tempProduct = product.Trim();
      if (tempProduct.Length > 0) {
        if (tempProduct.Length < 10) {
          product_id = tempProduct;
        }
        else {
          int charPosition = tempProduct.IndexOf(" ");
          product_id = tempProduct.Substring(0, charPosition);
        }
        try {
          s_product = productAdapter.GetProductName(product_id).ToString();
        }
        catch (Exception e) {
          if (e.Message.ToString() == "Object reference not set to an instance of an object.") {
            s_product = "";
          }
          else {
            errLog.WriteLine("Invalid product ID " + e.Message.ToString());
            Console.WriteLine("Invalid product ID " + e.Message.ToString());
            throw;
          } //else
        } //catch
        if (s_product.Length > 0) {
          sTemp = sTemp + s_product + "; ";
        }
      } //if product.length > 0
    } //foreach product in productTokens

真的,真的很丑!特别是我在 catch 块中测试无效 ID 的部分。必须有更好的方法来处理这个问题。

如果有人可以帮助我,我将不胜感激。

谢谢。

4

3 回答 3

2

那时你不应该调用 ToString() ,首先你应该检查返回的值是否为空;

object productName = productAdapter.GetProductName(product_id);
if ( productName != null )
{
    s_product = productName.ToString();
}
else
{
    s_product = String.Empty;
}
于 2008-12-05T23:26:13.207 回答
1

除了 Rob 和 Marc 的建议之外,根据您上面的代码,我建议进行另一个调整;productAdapter.GetProductName()如果还没有返回 a ,我会感到非常惊讶,String这种情况下调用 ToString() 是完全多余的。如果它确实已经返回 a String,那么你的整个 try/catch 块变成一行:

s_product = productAdapter.GetProductName(product_id) ?? string.Empty;

另外,我认为提及已经返回String-的其他内容可能很有用Exception.Message。因此,您在代码中调用 ToString() 的所有不同位置也是完全多余的。

另外,我建议使用实例方法String.Split()而不是IndexOfand的组合SubString

product_id = tempProduct.Split(" ", 2)[1];

最后,Exception通过检查房产来决定你抓住了什么样的人Message应该是一个完全最后的方案。即使你真的需要在这里捕捉,你也应该明确地NullReferenceException这样做:

catch (NullReferenceException) {
    s_product = "";
}
catch (Exception e) {
    // Log your invalid ID error condition here
}

PS:我也不确定这个问题与 MySQL 有什么关系,因为在您的代码中没有任何 DB API 的证据。

于 2008-12-06T00:12:14.253 回答
0

您不能简单地检查 GetProductName 是否返回 null 吗?

var productName = s_product = productAdapter.GetProductName(product_id);
if(productName == null) { ... do something }
else {
    string name = productName.ToString();
}
于 2008-12-05T23:27:26.090 回答