Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何正确处理n层应用程序中的错误?_.net_Asp.net_Error Handling_Webforms - Fatal编程技术网

.net 如何正确处理n层应用程序中的错误?

.net 如何正确处理n层应用程序中的错误?,.net,asp.net,error-handling,webforms,.net,Asp.net,Error Handling,Webforms,从第一天起,我就一直在努力解决这个问题。我周围有很多甚至根本不处理错误的代码,这可能对我没有帮助 无论如何,我正在使用传统的n层设计中的WebForms:UI->BLL->DAL。通常我所做的(我知道这是不对的)是尝试/捕获我的数据操作。如果有一个例外,我只是简单地抛出泡沫 try 'db operations catch ex as exception throw finally 'close connections end 因此,它会出现在BLL中,在那里有另一个try/catch,我将记

从第一天起,我就一直在努力解决这个问题。我周围有很多甚至根本不处理错误的代码,这可能对我没有帮助

无论如何,我正在使用传统的n层设计中的WebForms:UI->BLL->DAL。通常我所做的(我知道这是不对的)是尝试/捕获我的数据操作。如果有一个例外,我只是简单地抛出泡沫

try
'db operations
catch ex as exception
throw
finally
'close connections
end
因此,它会出现在BLL中,在那里有另一个try/catch,我将记录错误。现在我想提醒用户出了什么问题,所以我再次抛出它,这样它就会冒泡到UI上。在UI级别,我将使用try/catch包装,如果出现错误,我将向他们显示友好消息


你的想法是什么?在这里我能做得更好吗?

据我所知,您有三个try/Catch-每层一个:DAL、BLL和UI

你应该只在你打算做点什么的时候才接球

据我所知,你只是简单地从达尔追溯,所以没有必要

从BLL中记录exeption,这是一个很好的实践,因为您将能够收集有关异常的数据,以最终改进应用程序

然后在UI层捕获异常,将其转换为用户友好的内容。没关系

因此,我只会从DAL层中删除try/catch——如果您真的只需要追溯异常就可以了

在某些情况下,可以在BLL处添加一个标识符,该标识符将传递给UI异常并显示给最终用户,以便在他们调用支持时,支持人员可以将给定Id与服务器日志上的异常关联起来


可以这样做,例如,添加一个Guid或其他对Exception.Data collection有意义且唯一的东西。

您需要在UI中抛出异常和捕获,如。。。在BLL中

try
        {
            //your code
        }
        catch (System.Data.SqlClient.SqlException ex)
        {
            if (ex.Number == 547)
            {
                throw new Exception("ActiveRecord");
            }
        }
        finally
        {
            MasterConnection.Close();
        }
在UI中链接执行选项并显示用户友好的消息

 if (e.Exception != null)
    {
        if (e.Exception.InnerException.Message == "ActiveRecord")
        {
            //Show here User freind message
        }
    }

与其他答案不同,我将建议您也从UI中删除try/catch。您的BLL应该捕获异常,记录它,然后为UI提供一些机制来查询发生了什么错误

这将导致更干净的UI代码,因为您不必枚举业务层可能抛出的所有异常。您可以将UI代码简化为:

if (businessObject.doSomeOperation == true) {
   // Do whatever you need to here.
} else {
   // output error message from businessobject
   // something like businessObject.LastErrorMessage();
}

但是如果DAL中发生错误,我不必关闭连接以防止泄漏吗?如果使用“using”语句,则无需显式地尝试/捕获DAL。在封面下,“Using”将用try/finally包装您的连接/命令,并在finally中关闭它们。