只有一个例外,Catch退出

时间:2012-09-09 12:09:22

标签: c# append try-catch stringbuilder

在我下面显示的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。

5 个答案:

答案 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以找到早期炸弹的原因。 (正如齐塞默所说,停止重新初始化某人。)