全局异常处理程序执行后退回到操作方法

时间:2017-09-09 16:22:21

标签: c# asp.net-mvc

我想全局捕获模型和控制器中抛出的任何异常,因为我假设每个操作方法都遵循逻辑:

THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) {

    return new THREE.Face3( a, b, c, normal, color, materialIndex );

};

业务逻辑层将抛出用户将能够处理的异常,并且将向他显示有关该异常的消息。所有其他类型的异常将保存在服务器日志中,用户将获得错误页面。

因为该逻辑将在每个控制器中重复,所以我决定将其移动到全局异常处理程序。但问题是:是否有可能从异常处理程序属性返回到它被抛出的行中?我想实现类似的目标:

for ( var i=0, vl=verts.length; i<vl; i+=4) {
    geom.faces.push(new THREE.Face4(i, i+1, i+2, i+3));
    geom.faces.push(new THREE.Face4(i, i+3, i+2, i+1));
}

这是明确的解决方案吗,最好的方法是什么?您如何看待这种方法?

1 个答案:

答案 0 :(得分:0)

不幸的是,我认为C#中没有办法做到这一点,但你可以建立一些逻辑来为你做。

在你的Action代码中,你只需要稍后抛出异常,就像在内部记录异常一样,只在方法结束时抛出异常。例如:

public void SomeAction()
{
    Exception innerEx;
    try
    {
        //some code that may/may not cause exceptions.
    }catch(Exception e)
    {
        innerEx = e;
    }
    //some more execution code, equivelent to your "carry on at line x"
    throw innerEx;
}

显然这意味着除了你正在使用的包装器之外,你的动作代码必须改变,但我认为这是你不幸遇到的问题:(

TBH,我认为应该重写动作的代码,因为崩溃的程序应该停止执行,开发人员通常会在其方法中放入错误检查代码。

(为了避免混淆,我一直使用Action来表示System.Action类,而不是mvc动作类,因为我对MVC知之甚少,不过我希望它有意义:P)

我还会说你可能会遗漏一些东西 - 你是否考虑将你正在调用的方法分成多个单独的电话?因此,您可以立即调用它们,对其中一个调用的异常结果做出适当的反应,而其他调用则会很愉快。