JScript.NET能否区分不同的.NET异常类型

JScript.NET能否区分不同的.NET异常类型,.net,javascript,exception,.net,Javascript,Exception,我正在使用JScript.NET在我编写的C#WinForms应用程序中编写脚本。它工作得非常好,但我只是尝试在脚本中添加一些异常处理,我不知道如何判断从我的C#代码中抛出了什么类型的异常 下面是一些示例JScript代码,它抛出两种不同类型的CLR异常,然后尝试捕获它们并将它们区分开来 function ErrorTest(name) { try { if (name.length < 5) { throw new

我正在使用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;
    }
}
功能错误测试(名称)
{
尝试
{
如果(名称长度<5)
{
抛出新ArgumentException();
}否则
{
抛出新的InvalidOperationException();
}
}捕获(e)
{
返回e.name++(e.number&0xFFFF)+:“+e.message;
}
}
如果调用
ErrorTest(“foo”)
,则返回
“错误5022:值不在预期范围内。”
,如果调用
ErrorTest(“foobar”)
,则返回
“错误5022:由于对象的当前状态,操作无效。”


名称和编号属性相同,唯一的区别是消息。我不想开始基于错误消息编写错误处理逻辑,那么是否有办法获得原始异常而不是JScript
error
对象?

您应该能够做到:

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;
    }
}
功能错误测试(名称)
{
尝试
{
如果(名称长度<5)
{
抛出新ArgumentException();
}否则
{
抛出新的InvalidOperationException();
}
}
捕获(e)
{
返回“参数异常:”+e.message;
}
捕获(无效操作异常)
{
返回“操作异常:”+e.消息;
}
捕获(e)
{
返回“未知异常:”+e.message;
}
}

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

您可以使用获取原始异常,然后使用
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";
    }
}
功能错误测试(名称)
{
尝试
{
如果(名称长度<5)
{
抛出新ArgumentException();
}否则
{
抛出新的InvalidOperationException();
}
}捕获(e)
{
var ex=ErrorObject.ToException(e);
if(ex instanceof ArgumentException)
{
返回“坏参数”;
}
返回“不好的东西”;
}
}

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

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

谢谢,但是示例是JScript代码,因此catch语句不允许异常类型。我似乎只允许使用一个变量名。这一点很好。您可以抛出新错误(数字,“MessageString”)并以这种方式测试数字。我认为您试图从JScript.Sweet中操纵CLR异常可能是运气不好!四个月前你在哪里?我想我应该继续浏览JScript文档。我也这么想!四个月前我在哪里!?事实上,我已经阅读了几乎所有的JScript文档,并且在这方面做得更好。我在这里留下这篇文章作为参考,但公认的答案显然要好得多。