在我下面显示的try / catch中,应用程序循环遍历用户输入文本框的单词。 (我已经证实这个部分有效。)当它循环通过单词时,它将每个单词传递给下面的函数。
private string runQuery(string data)
{
// Step 1 - Declare the query and parameters
SqlCeConnection connection = new SqlCeConnection(@"Data Source=keywordDB.sdf");
SqlCeCommand cmd = new SqlCeCommand("SELECT abbrev, description FROM abbreviations WHERE abbrev LIKE @abbrev", connection);
cmd.Parameters.AddWithValue("@abbrev", data);
SqlCeDataReader reader;
try
{
// Step 2 - Opens the connection
connection.Open();
// Step 3- Execute query and assign the data to abbrevQueryResult and results
reader = cmd.ExecuteReader();
reader.Read();
abbrevQueryResult = reader[0].ToString();
results = reader[1].ToString();
// Step 4 compare abbrevQueryResult to data entered by user in textbox
if (abbrevQueryResult.ToLower().Equals(data.ToLowerInvariant()))
{
returnResults.Append(" " + results + ",");
}
}
catch (InvalidOperationException e)
{
badData = new StringBuilder();
badData.Append(" " + data);
}
finally
{
if (connection != null)
{
connection.Close();
}
}
return returnResults.ToString();
}
我注意到如果我输入6个单词,其中3个应该正常工作,3个应该被catch语句捕获,catch语句将只捕获最后一个。知道为什么它只能抓住其中一个词吗?我喜欢它捕获所有这些并将它们全部添加到StringBuilder badData。
答案 0 :(得分:5)
在这种普通情况下,你真的不应该使用try / catch和exception机制来确定数据的有效性。这就是为什么它被称为“异常”,因为它旨在处理可能导致程序崩溃的特殊情况。如果您希望输入的某个百分比无效,那么请对其进行普通的逻辑测试。
if (valid(word) {function(word);} else {addToErrorList(word);}
答案 1 :(得分:3)
您没有显示声明badData
的位置。但是,每次调用catch块时,都会将badData
重置为新的StringBuilder - 这意味着它的旧实例(以及其中保存的任何值)将被丢弃。如果你在catch块中删除了这一行:
badData = new StringBuilder();
你可能会更接近你想去的地方。
执行此操作后,当您最终得到空指针异常时,您需要确保badData
被实例化为= new StringBuilder();
(就像您拥有它),无论您已经声明它 - IE ,作为方法之外的实例变量。
答案 2 :(得分:1)
您每次都会在catch区块中设置badData = new StringBuilder();
。所以,它确实被抓了3次,但你只看到StringBuilder
答案 3 :(得分:1)
如果希望badData
包含所有错误,则无法在catch子句中初始化变量,因为那时您将为捕获的每个异常重置变量。如果你在其他地方初始化它,这可以工作。
在课堂顶部初始化它:
public class MyClass {
private StringBuilder badData = new StringBuilder();
// Other code
}
在构造函数中初始化它:
public class MyClass {
private StringBuilder badData;
public MyClass() {
badData = new StringBuilder();
}
}
通过这样做,只要对象存在,变量就会存在,然后你只需要删除catch子句中的初始化,这样变量就不会被重置为新的StringBuilder
对象。捕获异常的时间(因此将附加所有错误,而不仅仅是最后一个错误。)
答案 4 :(得分:1)
SQL访问代码非常脆弱,我的猜测是原因,但重点是,您的异常处理不充分,因为您只捕获InvalidOperationException。在末尾添加另一个捕获类型Exception以找到早期炸弹的原因。 (正如齐塞默所说,停止重新初始化某人。)