Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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
C# 可重用的Try/Catch块_C#_Asp.net - Fatal编程技术网

C# 可重用的Try/Catch块

C# 可重用的Try/Catch块,c#,asp.net,C#,Asp.net,我编写了下面的方法,认为它允许我传入一个方法调用,并将其包装在try-catch中。我试图避免在整个应用程序中使用相同的try/catch锅炉板编码。我已经接到20多个电话,当我们结束时,将有数百个电话 protected T CallRepository<T>(T repositoryMethod) { try { return repositoryMethod; } catch (Exception ex) {

我编写了下面的方法,认为它允许我传入一个方法调用,并将其包装在try-catch中。我试图避免在整个应用程序中使用相同的try/catch锅炉板编码。我已经接到20多个电话,当我们结束时,将有数百个电话

protected T CallRepository<T>(T repositoryMethod)
{
    try
    {
        return repositoryMethod;
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        throw new DatabaseException();
    }
}
protectedt CallRepository(T repositoryMethod)
{
尝试
{
返回存储法;
}
捕获(例外情况除外)
{
记录器错误(ex);
抛出新的DatabaseException();
}
}
调用方法如下所示:

var results = CallRepository<VisitLogDTO>(visitLogRepository.AddVisit(visitLogDTO));
var results=CallRepository(visitLogRepository.AddVisit(visitLogDTO));
起初我没有意识到这并没有像预期的那样起作用。所发生的事情是结果被包装在try/catch中,而不是方法调用中。如果我从visitLogRepository中得到一个数据库错误或任何错误,那么我将返回原始错误,而不是新的DatabaseExeception


任何帮助都将不胜感激。

您需要传入一个
Func
,而不是
T

protected T CallRepository<T>(Func<T> repositoryMethod)
{
    try
    {
        return repositoryMethod();
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        throw;
    }
}

您需要传入一个
Func
,而不是
T

protected T CallRepository<T>(Func<T> repositoryMethod)
{
    try
    {
        return repositoryMethod();
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        throw;
    }
}

我不确定,但AddVisit方法似乎是在CallRepository方法之外调用的。 尝试使用动作委托作为方法参数,并在方法中调用该委托,以确保调用在Try catch中完成。 然后使用Lambda表达式调用它:

private handleException(Action myAction)
{
    try
    {
        myAction();
    }
    catch[...]
}
电话:

最好的
Lumo

我不确定,但AddVisit方法似乎是在CallRepository方法之外调用的。 尝试使用动作委托作为方法参数,并在方法中调用该委托,以确保调用在Try catch中完成。 然后使用Lambda表达式调用它:

private handleException(Action myAction)
{
    try
    {
        myAction();
    }
    catch[...]
}
电话:

最好的
Lumo

您不调用该方法。您可以传入
visitLogRepository.AddVisit(visitLogDTO)
的结果。你想要的是你的CallRepository需要一个Func参数。这里有一些非常好的信息,现在我的问题已经解决了,我非常感谢你的帮助,我对帮助来得如此之快感到惊讶。我将研究DI拦截,看看是否可以利用它,但目前我正在使用WeSt&Eren Ersönmez对Func的建议。我以前尝试过使用Func,但没有成功。我错过了lambda调用,这会产生很大的不同。您不调用该方法。您可以传入
visitLogRepository.AddVisit(visitLogDTO)
的结果。你想要的是你的CallRepository需要一个Func参数。这里有一些非常好的信息,现在我的问题已经解决了,我非常感谢你的帮助,我对帮助来得如此之快感到惊讶。我将研究DI拦截,看看是否可以利用它,但目前我正在使用WeSt&Eren Ersönmez对Func的建议。我以前尝试过使用Func,但没有成功。我错过了lambda的电话,这让一切都不同了。请注意,与其重新发明轮子,不如使用应用程序应该使用的DI框架的日志记录/拦截功能……我正在致力于转换为Func。目前我得到了错误,因为我仍然有一个返回类型,它不满意。我会继续玩。我正在使用Microsoft Unity进行依赖注入。我不熟悉一个内置的日志/拦截,它允许我捕获数据层错误,记录它,然后重新抛出一个友好的错误,我将再次在MVC层捕获该错误,并将用户重定向到友好的错误页面。除了Unity,我不能添加其他第三方NuGet软件包,因为我工作的地方有非常严格的安全措施。如果它是统一的一部分,我就不感兴趣了。@CubeRoot统一做依赖注入,但它也做的另一件事叫做依赖注入。事实上,在我刚刚链接的页面上,他们展示了如何编写日志拦截器。+1。请注意,与其重新发明轮子,不如使用应用程序应该使用的DI框架的日志记录/拦截功能……我正在致力于转换为Func。目前我得到了错误,因为我仍然有一个返回类型,它不满意。我会继续玩。我正在使用Microsoft Unity进行依赖注入。我不熟悉一个内置的日志/拦截,它允许我捕获数据层错误,记录它,然后重新抛出一个友好的错误,我将再次在MVC层捕获该错误,并将用户重定向到友好的错误页面。除了Unity,我不能添加其他第三方NuGet软件包,因为我工作的地方有非常严格的安全措施。如果它是统一的一部分,我就不感兴趣了。@CubeRoot统一做依赖注入,但它也做的另一件事叫做依赖注入。事实上,在我刚刚链接的页面上,它们展示了如何编写日志拦截器。这会允许返回类型吗?大多数方法调用返回数据。这是否允许返回类型?大多数方法调用都返回数据。