簡體   English   中英

try / catch塊未捕獲異常

[英]try/catch block not catching an exception

我遇到一個問題,即try / catch塊未捕獲異常。 該問題發生在command.ExecuteReader()處 ,但從未被發現。 我正在調試模式下運行,並且已經嘗試了一些有關調試器設置的建議選項,但無濟於事。

我確實要提到我正在使用SQLite作為提供程序,並且可以看到它引發了SQLiteException,但是問題仍然存在。 在特定情況下不會捕獲異常嗎? (除了StackOverflowException,ThreadAbortedException等...)

    public IEnumerable<dynamic> Query(string sql, params object[] parms)
    {
        try
        {
            return QueryCore(sql, parms);
        }
        catch (Exception ex)
        {
            throw new DbException(sql, parms, ex);
        }
    }

    private IEnumerable<dynamic> QueryCore(string sql, params object[] parms)
    {
        using (var connection = CreateConnection())
        {
            using (var command = CreateCommand(sql, connection, parms))
            {
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        yield return reader.ToExpando();
                    }
                }
            }
        }
    }

我還想補充一點,如果我對數據庫產生正確的查詢,我會得到結果,但是當我中斷查詢時,會引發異常,但是不會被捕獲。

發生這種情況是因為您要使用yield關鍵字返回數據。 這使得數據實際數據方法僅在枚舉結果時才運行。

您可能不希望發生這種情況,尤其是因為如果將結果枚舉兩次(例如,兩個單獨的foreach循環),則數據將被讀取兩次。 您可以執行以下操作使枚舉立即發生並捕獲任何異常:

public IEnumerable<dynamic> Query(string sql, params object[] parms)
{
    try
    {
        return QueryCore(sql, parms).ToArray();
    }
    catch (Exception ex)
    {
        throw new DbException(sql, parms, ex);
    }
}

對於需要花費一些時間才能獲得物品的情況,並且在循環瀏覽它們之前,您並不想獲得所有物品,Yielding很有用。 因此,另一種可能的解決方案可能是這樣:對於代碼的可讀性更好(我認為不需要屈服):

public IEnumerable<dynamic> Query(string sql, params object[] parms)
{
    try
    {
        return QueryCore(sql, parms);
    }
    catch (Exception ex)
    {
        throw new DbException(sql, parms, ex);
    }
}

private IEnumerable<dynamic> QueryCore(string sql, params object[] parms)
{
    using (var connection = CreateConnection())
    {
        using (var command = CreateCommand(sql, connection, parms))
        {
            using (var reader = command.ExecuteReader())
            {
                var results = new List<dynamic>();
                while (reader.Read())
                {
                    results.Add(reader.ToExpando());
                }

                return results;
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM