gpt4 book ai didi

c# - 在 C# 中捕获特定异常与通用异常

转载 作者:太空狗 更新时间:2023-10-29 18:01:20 25 4
gpt4 key购买 nike

这个问题来自对我创建的对象运行的代码分析。分析表明我应该捕获比基本异常更具体的异常类型。

您是否发现自己只使用捕获通用异常或 try catch 特定异常并默认使用多个捕获 block 的通用异常?

有问题的代码块之一如下:

internal static bool ClearFlags(string connectionString, Guid ID)
{
bool returnValue = false;
SqlConnection dbEngine = new SqlConnection(connectionString);
SqlCommand dbCmd = new SqlCommand("ClearFlags", dbEngine);
SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCmd);

dbCmd.CommandType = CommandType.StoredProcedure;
try
{
dbCmd.Parameters.AddWithValue("@ID", ID.ToString());

dbEngine.Open();
dbCmd.ExecuteNonQuery();
dbEngine.Close();

returnValue = true;
}
catch (Exception ex)
{ ErrorHandler(ex); }

return returnValue;
}

谢谢你的建议

编辑:这是代码分析的警告

警告 351 CA1031:Microsoft.Design:修改“ClearFlags(string, Guid)”以捕获比“Exception”更具体的异常或重新抛出异常

最佳答案

您几乎不应该捕获顶级异常。

在大多数情况下,您应该尽可能捕获并处理最具体的异常,并且只有当您可以使用它做一些有用的事情时。

异常(exception)情况(哈哈)是,如果您正在捕获日志记录并重新抛出异常,那么有时捕获顶级异常、记录它并重新抛出它是可以的。

您几乎不应该捕获顶级异常并吞下它。这是因为如果您正在捕获顶级异常,您并不真正知道您在处理什么;绝对是任何事情都可能导致它,所以你几乎肯定无法做任何事情来正确处理每一个失败案例。可能有一些您可能只想静静地处理和吞下的失败,但是通过吞下顶级异常,您也会吞下一大堆本来应该向上抛出以便您的代码处理更高层的异常。在您的代码示例中,您可能想要做的是处理 SQLException 并记录+吞下它;然后对于异常,记录并重新抛出它。这涵盖了你自己。您仍在记录所有异常类型,但您只吞下了相当可预测的 SQLException,它表明您的 SQL/数据库存在问题。

一个常见的做法是只处理您当时实际可以解决的每个异常,如果您无法在代码中的那个时间点解决它,那么您允许它向上冒泡。如果你不能在下一个层次上解决它,就让它继续向上。如果到达顶部未处理,则向用户显示礼貌的道歉(可能尝试快速自动保存)并关闭应用程序。通常认为允许应用程序在出现未处理的异常后继续运行更糟糕,因为您无法在发生异常情况时预测应用程序的状态。最好关闭并重新启动应用程序以返回到预期状态。

关于c# - 在 C# 中捕获特定异常与通用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1411289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com