首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法捕获MSScriptControl的Eval函数中引发的自定义异常

无法捕获MSScriptControl的Eval函数中引发的自定义异常
EN

Stack Overflow用户
提问于 2017-07-31 04:13:46
回答 1查看 592关注 0票数 2

这是我的问题。

我有这样的方法,用MSScriptControl动态地计算一些公式。

代码语言:javascript
复制
public void DoCalculate()
{
    try
    {
        var evaluator = new Evaluator();
        IScriptControl ctrl = new ScriptControl();
        ctrl.Language = "JavaScript";
        ctrl.AddObject("Evaluator", evaluator, false);
        var calcFunction = "Number(Evaluator.Divide(4,0))";
        double rs = ctrl.Eval(calcFunction);
    }
    catch (CustomException cex)
    {
        // Handle CustomException.
    }
    catch (Exception ex)
    {
        // Handle general Exception.
    }
}

这是评估器类。

代码语言:javascript
复制
public class Evaluator
{
    public double Divide(int a, int b)
    {
        if (b == 0)
        {
            throw new CustomException("Cannot divide by zero");
        }
        else
        {
            return a / b;
        }
    }

    public void TestThrow()
    {
        throw new CustomException("This is a test");
    }
}

这是CustomException类:

代码语言:javascript
复制
using System;

namespace Library
{
    public class CustomException : Exception
    {
        public CustomException()
            : base()
        {
        }

        public CustomException(string message)
            : base(message)
        {
        }
    }
}

我希望在本例中抛出一个CustomException,并输入第一个catch子句。但是,我得到了一个通用的Exception (我使用GetType().Name验证了异常类型),它的消息是“不能除以零”。

不过,我在评价器类中确实得到了以下错误:

“Library.CustomException”类型的异常发生在XXX.dll中,但未在用户代码中处理

如果我像这样修改我的DoCalculate(),那么我就可以捕获一个CustomException了:

代码语言:javascript
复制
public void DoCalculate()
{
    try
    {
        var evaluator = new Evaluator();
        evaluator.TestThrow();
    }
    catch (CustomException cex)
    {
        // Handle CustomException.
    }
    catch (Exception ex)
    {
        // Handle general Exception.
    }
}

这是否意味着不可能从Eval函数中定义和抛出我自己的异常?

我使用的是.NET 4.6.2和Interop.MSScriptControl 1.0.0.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 05:55:16

这是链接给出的答案的总结

COM方法通过返回HRESULTs报告错误;.NET方法通过抛出异常来报告错误。运行时处理两者之间的转换。.NET框架中的每个异常类都映射到HRESULT。因此,为了抛出适当的异常,让我提出以下建议。

代码语言:javascript
复制
var evaluator = new Evaluator();
IScriptControl ctrl = new MSScriptControl.ScriptControl { Language = "VBScript" };
ctrl.AddObject("Evaluator", new Evaluator(), true);
const string calcFunction = "Evaluator.Divide(4,0)";
try {
    double rs = ctrl.Eval(calcFunction);
}
catch (DivideByZeroException ex) {//Actual DivideByZeroException from .Net
    //How can you divide by zero?!?!
}
catch (Exception ex) {
    //STUFF
}

public class Evaluator {

    public double Divide(int a, int b) {
        if (b == 0) {
            throw new MyDivideByZeroException();
        }
        return a / b;
    }
}

public class MyDivideByZeroException : Exception {

    public MyDivideByZeroException() {
        HResult = -2147352558;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45407362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档