[英]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.