如果我们只想记录异常,我们应该试试catch函数吗?

问题描述:

在asp.net应用程序,都发生,而不是内尝试捕捉可以通过的Application_Error处理例外。如果我们只想记录异常,我们应该试试catch函数吗?

如果我们只是需要与它的堆栈跟踪沿记录异常,我们用不着内捕获的任何其他决定/逻辑,我们为什么要放尝试捕捉在应用程序/ BL或dal层的功能呢?是否有任何理由将try/catch与每个数据库调用函数配合使用?

例如,我们有上百个在DAL层功能执行已下面的代码:

try 
{ 
    //open db connection, execute stored procedure 
} 
catch 
{ 
    //log error 
} 

如果我们从存储过程或在打开数据库连接任何异常,我们会得到一个异常,但我们不这样做除了记录这些错我们没有非常关键的数据存储/检索要求。我们记录错误只是为了提醒并稍后修复。这是正确的捕捉每一个这样的功能?

+2

还有一个原因,使用'try'和'不管catch'。这只是编程的一个基本部分。所以,答案是肯定的。 –

+0

是什么原因?特别是我们无法通过在application_error函数中放置日志记录异常来实现? – maverick

+0

不要导致您的代码回退到application_error。每个错误应该在其生成的范围内处理。 application_error是你最后的回退,理论上永远不会达到。 –

使用trycatch不是仅仅记录的目的,与数据库连接时尤其如此。

的异常意味着的东西没有完成。如果没有完成,您的业务流程失败。如果您的业务流程失败,则需要了解该业务流程并在该代码的范围内处理它,而不是application_error。每个错误应该在其生成的范围内处理。 application_error应该是你最后的回退,理论上应该永远不会达到。

当然,您可以使用它进行日志记录,但也可以用它来关闭数据库连接(可能在发生异常之前打开并且永远保持打开状态),通知用户发生了异常,并进行数据恢复处理异常或准备重试的过程。

所以,把你贴模板,好的代码处理应该是这样的:

try 
{ 
    //open db connection, execute stored procedure 
} 
catch 
{ 
    // Inform the user 
    // Alternate your process or preparing for retry 
    // log error 
} 
finally 
{ 
    // Close the DB connection 
} 
+0

如果我们使用dapper,可以自动处理关闭数据库连接。 (https://stackoverflow.com/questions/40824948/closing-connection-when-using-dapper)。如果我们没有任何要求重试相同的请求,不应该将日志记录部分在一些常见的级别上处理吗? – maverick

+0

@maverick这是基于意见的,但对我的意见来说,使用“一般”错误处理,如你所说的“普通级别”,是不好的做法。再次 - 每个错误都有一个意思,没有一个普遍的错误。每个失败的DB执行都有其后果,应该在其范围内予以关注。 –

一个只能在地方,你可以切实处理异常使用try/catch块。但是,“有意义的处理”包括提供良好的错误消息。

如果catch块只需登录没有额外的背景下异常,那么这样的块可以与顶级处理器(像的Application_Error)取代了做同样的事情。

但是,如果你只在调用点登录提供更多的信息,然后有一个catch块是完全合理的:它通过提供更好的诊断,这是一个完全合法的目标,增强了经验。

+0

什么是顶级处理程序,application_error? – maverick

+1

@maverick正确。 – dasblinkenlight