C#从数据库查询降级的最佳方法

C#从数据库查询降级的最佳方法,c#,exception,exception-handling,C#,Exception,Exception Handling,我已经自学了C#,目前我正在开发一个试接块。它是写入数据库 try { //Write to Database } catch (SqlException ex) { //report issue //close connection } catch (Exception ex) { //report issue //close connection

我已经自学了C#,目前我正在开发一个试接块。它是写入数据库

    try
    {
        //Write to Database
    }
    catch (SqlException ex)
    {
        //report issue
        //close connection
    }
    catch (Exception ex)
    {
        //report issue
        //close connection
    }
    finally
    {
        //close connection
    }
是否有其他应检查的异常情况

如果连接字符串失败,我是否也要检查


或者SQLException本身就足够好了吗?

Exception类是一个grneric类,它将捕获所有异常

Exception类是一个grneric类,如果您在
SqlConnection
SqlCommand
SqlDataReader
周围放置
使用
块,它将捕获所有异常(如果适用)则不需要显式的
try/catch
来确保任何东西都已被处理

using(var connection = new SqlConnection(connectionString)
using(var command = new SqlCommand(procedureName, connection)
{
    //etc
}
为了明确回答您关于捕获
SqlException
异常的问题,答案是-是的,如果您希望由于
SqlException
与任何其他异常而做一些不同的事情,那么首先捕获
SqlException
。但是您可能不会。可能没有理由,所以不,我不需要为
SqlException
单独捕获。只在需要时执行

这就留下了一个问题-您真的需要在这个方法中捕获任何异常吗?答案可能不是。如果抛出异常,
使用
将处理任何需要处理的异常,那么该异常可以冒泡到任何调用它的方法。在某个时候,您会想记录它,但不需要在eve时记录例如,如果它是一个WCF服务,您可以只记录调用服务方法时抛出的异常

在某些情况下,您可能需要捕获异常,以便以不同的方式进行响应。可能您正在查询多个数据集,如果其中一个数据集失败,您可以记录错误并返回空结果,而不是导致下游失败。但这并不太常见


另一个值得一看的是AOP-。许多方法需要异常日志记录,但它不是这些类的真正功能。因此,有一些方法可以将这些不相关但必要的代码保留在大多数类和方法之外。我链接到PostSharp,但我个人使用它,因为它提供了依赖项注入和拦截器,可以rap方法调用异常处理之类的东西。

如果在
SqlConnection
SqlCommand
SqlDataReader
(如果适用)周围使用
块放置
,则不需要显式的
try/catch
,以确保处理任何内容

using(var connection = new SqlConnection(connectionString)
using(var command = new SqlCommand(procedureName, connection)
{
    //etc
}
为了明确回答您关于捕获
SqlException
异常的问题,答案是-是的,如果您希望由于
SqlException
与任何其他异常而做一些不同的事情,那么首先捕获
SqlException
。但是您可能不会。可能没有理由,所以不,我不需要为
SqlException
单独捕获。只在需要时执行

这就留下了一个问题-您真的需要在这个方法中捕获任何异常吗?答案可能不是。如果抛出异常,
使用
将处理任何需要处理的异常,那么该异常可以冒泡到任何调用它的方法。在某个时候,您会想记录它,但不需要在eve时记录例如,如果它是一个WCF服务,您可以只记录调用服务方法时抛出的异常

在某些情况下,您可能需要捕获异常,以便以不同的方式进行响应。可能您正在查询多个数据集,如果其中一个数据集失败,您可以记录错误并返回空结果,而不是导致下游失败。但这并不太常见


另一个值得一看的是AOP-。许多方法需要异常日志记录,但它不是这些类的真正功能。因此,有一些方法可以将这些不相关但必要的代码保留在大多数类和方法之外。我链接到PostSharp,但我个人使用它,因为它提供了依赖项注入和拦截器,可以rap方法调用异常处理等功能。

不要在
finally
中显式关闭连接,只需使用
块将连接放入
中即可。此外,如果确实在finally中关闭了连接,则无需在
catch
中关闭它,
finally
即使转到中,也会运行de>catch
块。不要在
finally
块中显式关闭连接,只需使用
块将连接放入
块中即可。此外,如果确实在finally块中关闭了连接,则无需在
catch
块中关闭连接,即使转到
catch
块,
finally
仍会运行。