我正在使用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."
名称和数字属性是相同的,唯一的区别是消息。我不想基于错误消息开始编写错误处理逻辑,那么有没有办法获得原始异常而不是JScript Error
对象?
答案 0 :(得分:3)
使用JScript .NET的类型注释支持,如下所示:
try { }
catch (e : ArgumentException) {
// ...
}
答案 1 :(得分:0)
您可以使用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";
}
}
答案 2 :(得分:-1)
你应该可以这样做:
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;
}
}
并对每种异常类型进行单独的错误处理。