2008-12-05 84 views
0

我從某處讀取永遠不應該使用錯誤條件作爲正常程序流的地方。對我來說意義非凡...但是如何在SQL Select返回Nothing時避免拋出錯誤

坐在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的部分。必須有更好的方法來處理這個問題。

如果任何人都可以幫助我,我真的很感激。

謝謝。

回答

2

你不應該在那個時候調用ToString(),首先你應該檢查返回的值是否爲null;

object productName = productAdapter.GetProductName(product_id); 
if (productName != null) 
{ 
    s_product = productName.ToString(); 
} 
else 
{ 
    s_product = String.Empty; 
} 
+0

嗯......我沒有想到ToString()可能會拋出異常而不是抓取。我會給你一個鏡頭。 謝謝。 – EoRaptor013 2008-12-06 01:04:29

+0

你是對的!它是.ToString()拋出異常。如果我把它關閉,請求返回一個對象,我可以測試它,並轉換爲字符串,如果不是null。 – EoRaptor013 2008-12-08 04:54:30

0

難道你不能簡單地檢查GetProductName是否返回null?

var productName = s_product = productAdapter.GetProductName(product_id); 
if(productName == null) { ... do something } 
else { 
    string name = productName.ToString(); 
} 
1

除了Rob和Marc的建議,並根據您的代碼,我會建議另一個調整;如果productAdapter.GetProductName()不是已經返回String,我會非常驚訝,在這種情況下調用ToString()是完全多餘的。如果它確實已經返回String,那麼你的整個try/catch塊變成一條線:

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

另外,我想這可能是有用的提別的,已經返回String - Exception.Message。所以你在代碼中調用ToString()的所有不同的地方也是完全多餘的。

此外,我會建議使用實例方法String.Split()而不是IndexOfSubString組合:

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

最後,確定你已經通過檢查Message屬性應該是一個完全陷入什麼樣的Exception最後一個場景。即使你確實需要NullReferenceException這裏,你應該這樣做明確

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

PS:我也真的不知道是什麼這一切的問題有與MySQL做,因爲代碼中沒有任何數據庫API的證據。