如何在 javascript 中捕获 .NET 异常?

Posted

技术标签:

【中文标题】如何在 javascript 中捕获 .NET 异常?【英文标题】:How to catch a .NET exception in javascript? 【发布时间】:2013-11-11 07:29:00 【问题描述】:

我正在使用 ASP C#.NET MVC3 构建一个 webapp。

我有一个视图(.cshtml 文件)。在这个视图中,我有一个 javascript 函数“SomeFunction()”,它通过 Razor 调用 .NET 函数,如下所示:“@html.Raw(Json.Encode(Model))”。所以所有东西放在一起看起来像:

SomeFunction()
    var sections = @Html.Raw(Json.Encode(Model));

请注意@。

当字符串的大小超过最大值(基本上是段太多)时,该函数会抛出异常(准确地说是:Increase json response maxJsonLength in MVC 4)。 好吧,我的网站的要求并没有指示我通过异步检索数据和诸如此类的数据来实际处理这个问题(幸运的是)。 我很幸运能够简单地捕捉到这个异常并告诉用户:“节太多!请为节定义更大的大小。”或者类似的东西。 唉,我真的不明白如何做到这一点。我尝试了以下方法:

SomeFunction()
    try 
        var sections = @try 
            Html.Raw(Json.Encode(Model));
         catch (Exception e) 
            throw new Exception("Exception caught in .NET");
        
     catch(err) 
        alert('.NET exception caught in Javascript!');
    

注意 'try' 前面的 @ 表示 Razor 语法。

永远不会到达 javascript 中的 catch 子句中的“警报”。我来自桌面开发,所以我仍然是网络新手。这通常是如何完成的?

非常感谢您提前帮助我。

【问题讨论】:

在不明白它是如何工作的?它是否在将通过 Razor 呈现的 cshtml 文件中?如果是这样,它是如何与 Javascript 一起提供的!?你能详细说明你的情况吗? 我会回答你提出的答案。 【参考方案1】:

从技术上讲,你不能。

因为这是在不同环境中运行的两种不同语言(一种在服务器上,另一种在客户端上),所以最好的办法是在 ASP.NET 应用程序中捕获异常,然后将异常返回给客户端格式化为字符串以及执行是否成功的一些指示。

简单的例子就是这个 ajax 请求/响应:

我们的自定义响应对象:

public class JsonResponse

    public bool Success  get; set; 
    public string Message  get; set; 

用法:

[HttpPost]
public JsonResult DeleteMember(int id)

    try 
        this.memberService.DeleteMember(id);
    
    catch (Exception ex)
    
        return Json(new JsonResponse  Success = false, Message = ex.ToString());
    
    return Json(new JsonResponse  Success = true );

然后您的客户端 Javascript 会将对象返回给它,您可以在其中查看请求是否成功,如果没有,则异常/错误消息是什么。

<script type="text/javascript">

$(function() 
    $.post('@Html.Action("Member", "DeleteMember")', function(response) 
        if (response.Success == false) 
            alert(response.Message);
         else 
            alert("Member was deleted!");
        
    );
);

</script>

【讨论】:

好吧,第一关,感谢您的回答。其次,呃……也许我不明白,但这不是我的情况。我在我的问题中添加了更多细节。也许这可以澄清我的问题?【参考方案2】:

你在这里混合了两件事。 Javascript在客户端执行,c#代码驻留在服务器端并抛出异常。

所以这里基本上发生的是当这个视图被渲染时。这段代码被执行了

@try
            Html.Raw(Json.Encode(Model));
         catch (Exception e) 
            throw new Exception("Exception caught in .NET");
        
     catch(err) 
        alert('.NET exception caught in Javascript!');
    

最后发送给客户端的是Html.Raw(Json.Encode(Model)) 的输出,而它又什么也没产生。因为您没有包含 @ 前缀。

您可以做的是检查客户端本身的字符串长度

SomeFunction()
    var sections = "@Html.Raw(Json.Encode(Model))";
    if(sections.length > [MAX LENGTH])alert(SOMETHING);
    else
       sections = JSON.parse(sections);
       //your old code here
     

【讨论】:

感谢您的回答。对不起,你错了。 @ 前缀在“try”前面。我不知道你的答案应该解决什么问题。对不起。我正在通过 JSON 序列化视图的模型,以便我可以在 javascript 函数中访问模型(在我的例子中是对象的集合)。它工作正常。只需要正确捕获异常。查看更新的问题。【参考方案3】:

如果您通过 Razor 创建您的 javascript 函数(这听起来有点奇怪!)您应该决定如何管理异常,服务器端或客户端。下面的代码是一个异常管理,它将发生在我认为适合您的服务器端:

SomeFunction()
    string sections; 
    @try 
        sections = Html.Raw(Json.Encode(Model));
     
    catch (Exception e) 
        sections = "Error";
    

    if (sections == "Error")
    
        alert("Your message");
    

【讨论】:

首先,感谢您的回答。其次,我认为这可能会奏效。但我不完全明白我用 Html.Label 位做什么?最后,奇怪?为什么?我需要这个 javascript 函数中的视图模型。我在网上发现这可以用 Html.Raw(Json.Encode(Model)) 来完成。它工作正常,请注意。只需要正确处理异常。顺便说一句,我为我的问题添加了更多细节...... @TLRonin 不客气。通过 Html.Label 我的意思是您可以将所需的 html 内联,而不是发出警报。顺便说一句,如果你喜欢有一个警报,你可以用一个字符串填充它,然后在 javascript 中检查它是否是那个字符串。我已经更新了答案以满足您的要求。 有趣的是,您的回答实际上激发了我尝试的灵感。但是 Razor 代码中无法识别部分。所以我想出了别的东西(见我的回答)。再次感谢您与我一起思考。【参考方案4】:

你可以试试这个

SomeFunction()
    var sections = @try 
        Html.Raw(Json.Encode(Model));
     catch (Exception e) 
        Html.Raw(false)
    
    if(!!sections)
        alert('.NET exception caught in Javascript!');
    

【讨论】:

【参考方案5】:

Big Joe、Parv Sharma 和 mehrandvd 都有自己的观点。我现在意识到了。再次感谢您的贡献。很抱歉,我没有立即理解您的回答。

但是在我的情况下没有一个是完全有用的。至少...我尝试了 Big Joe's,但无法让它像我想要的那样工作(因为帖子会导致重新加载我不需要的页面)。

我所做的是:

在填充了我的模型(部分集合)的控制器的操作中,我现在已经尝试将集合序列化为 Json(所以这是服务器端)。这看起来像:

            List<Models.Section> sections = Models.Section.GetSectionsByCampaignID(campaignID);

            try 
                string sectionsAsJson = System.Web.Helpers.Json.Encode(sections);
             catch (Exception) 
                sections = null;
            

现在我在视图中的 javascript 中要做的就是检查 null,如下所示:

    var sections = @Html.Raw(Json.Encode(Model));

    if(sections != null)
        //Some code to do stuff with the sections.
     else 
        alert('Sorry for the inconvenience, but there are too much sections to draw. This is causing a technical error. Please edit the map and define a bigger section size.');
    

是的,也许经验丰富的 Web 开发人员无法解决这个问题。但它对我有用。是否有经验丰富的 Web 开发人员预见到任何重大问题?请评论。我随时准备了解更多信息。

【讨论】:

以上是关于如何在 javascript 中捕获 .NET 异常?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 不会在 WebSocket 实例化中捕获错误

如何在 AngularJS 中捕获/处理后端异常

是否可以捕获 JavaScript 异步回调中抛出的异常?

如何在 JavaScript 中捕获 NetworkError?

如何在ios上将按钮动作捕获到javascript中?

如何在 Javascript 中捕获用户操作所消耗的时间?