【问题标题】:Can JScript.NET distinguish different .NET exception typesJScript.NET 能否区分不同的 .NET 异常类型
【发布时间】:2009-02-20 18:04:31
【问题描述】:

我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得非常好,但我只是尝试在脚本中放置一些异常处理,我不知道如何判断我的 C# 代码中抛出了哪种类型的异常。

这里有一些示例 JScript 代码,它抛出两种不同类型的 CLR 异常,然后尝试捕获它们并将它们区分开来。

function ErrorTest(name)
{
    try
    {
        if (name.length < 5)
        {
            throw new ArgumentException();
        }else
        {
            throw new InvalidOperationException();
        }
    }catch (e)
    {
        return e.name + " " + (e.number & 0xFFFF) + ": " + e.message;
    }
}

如果我调用ErrorTest("foo"),那么我会返回"Error 5022: Value does not fall within the expected range.",如果我调用ErrorTest("foobar"),那么我会返回"Error 5022: Operation is not valid due to the current state of the object."

name 和 number 属性相同,唯一不同的是消息。我不想开始根据错误消息编写错误处理逻辑,那么有什么方法可以获取原始异常而不是 JScript Error 对象吗?

【问题讨论】:

    标签: .net javascript exception


    【解决方案1】:

    使用 JScript .NET 的类型注释支持,如下所示:

      try { }
      catch (e : ArgumentException) {
        // ...
      }
    

    【讨论】:

    • 甜蜜!四个月前你在哪里?我想我应该一直在寻找 JScript 文档。
    • 我也是这么想的!四个月前的我在哪里!?确实,我已经阅读了几乎所有的 JScript 文档,并且做得更好。
    【解决方案2】:

    您可以使用ErrorObject.ToException method获取原始异常,然后使用instanceof来决定如何处理。

    这可行,但我还没有决定是否使用它。我认为这是在滥用框架,因为文档说:

    此 API 支持 .NET Framework 基础结构,不能直接从您的代码中使用。

    此外,您还必须添加对 Microsoft.JScript 程序集的引用并导入 Microsoft.JScript 命名空间。

    这是新代码:

    function ErrorTest(name)
    {
        try
        {
            if (name.length < 5)
            {
                throw new ArgumentException();
            }else
            {
                throw new InvalidOperationException();
            }
        }catch (e)
        {
            var ex = ErrorObject.ToException(e);
            if (ex instanceof ArgumentException)
            {
                return "bad argument";
            }
            return "something bad";
        }
    }
    

    【讨论】:

    • 我把这个留在这里以供参考,但接受的答案显然要好得多。
    【解决方案3】:

    你应该可以做到:

    function ErrorTest(name)
    {
        try
        {
            if (name.length < 5)
            {
                throw new ArgumentException();
            }else
            {
                throw new InvalidOperationException();
            }
        }
        catch (ArgumentException e)
        {
            return "Argument Exception: " + e.message;
        }
        catch (InvalidOperationException e)
        {
            return "Operation Exception: " + e.message;
        }
        catch (e)
        {
            return "Unknown Exception: " + e.message;
        }
    }
    

    并以这种方式对每种异常类型进行单独的错误处理。

    【讨论】:

    • 谢谢,但示例是 JScript 代码,因此 catch 语句不允许异常类型。我似乎被允许的只是一个变量名。
    • 好点。您可以抛出 new Error(number,"MessageString") 并以这种方式测试数字。我认为您尝试从 JScript 操作 CLR 异常可能会不走运。
    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    相关资源
    最近更新 更多