出于不同原因抛出相同的异常是合法的吗?

时间:2011-12-08 11:10:43

标签: c# exception-handling

此代码已有10年历史,没有错误处理。代码来自一个没有解析器或扫描程序的简单脚本解释器,我正在尝试捕获解释器中的所有错误并返回错误消息的合适错误。

    //..
    //...
    // <exception cref = "ErrorInScriptException">Wrong number of tokens.</exception>
    // <exception cref = "ErrorInScriptException">Variable not found.</exception>
    // <exception cref = "ErrorInScriptException">Variable type is not string.</exception>
    // <param name = "splitScriptLine">Split script line to be interpreted.</param>
    private void MakeString(IList<string> splitScriptLine)
    {
        //check minimum of 3 tokens
        if (Tokens < 3)
        {
            throw CreateErrorInScriptException("IDS_Invalid_Token");
        }

        var dummy = string.Empty;

        //read strings
        for (var z = 2; z < Tokens; z++)
        {
            dummy = dummy + ReadStringToken(splitScriptLine[z]);
        }

        var variable = VariableList[splitScriptLine[1], FileIncludeLevel];

        //no string var detected
        if (variable == null)
        {
            throw CreateErrorInScriptException("IDS_116");
        }

        //write new string to destination var
        if (variable.Identifier.Equals(splitScriptLine[1]))
        {
            //variable found
            if (variable.VariableType !=
                VariableType.String)
            {
                throw CreateErrorInScriptException("IDS_113");
            }

            variable.Value = dummy;
            variable.IsVarString = true;
        }
    }

注意:如上面的代码所示,我在三种情况下抛出ErrorInScriptException,我只更改了消息。

[Serializable]
public class ErrorInScriptException : UniLoadApplicationException
{
    #region Constructors

    public ErrorInScriptException(string error)
        : base(error)
    {
    }

    #endregion Constructors


    #region Properties

    public string ErrorCode { get; set; }

    public string FileName { get; set; }

    public int LineNumber { get; set; }

    public string ScriptLine { get; set; }

    #endregion Properties
}



/// <summary>
///   Creates a script error.
/// </summary>
/// <param name = "message">Message to be shown.</param>
/// <returns>ErrorInScriptException or the script error.</returns>
protected Exception CreateErrorInScriptException(string message)
{
    var ex = new ErrorInScriptException(message)
             {
                ScriptLine = CurrentScriptLine,
                LineNumber = CurrentLineNumber,
                FileName = CurrentFileName,
                ErrorCode = message
             };
        ex.Data["Info"] = new ExceptionInfo(ErrorLevel.Error, message)
                      {
                        ExitApplication = false
                      };
        return ex;
}

2 个答案:

答案 0 :(得分:5)

这通常没问题。但是,如果您希望通过代码捕获和处理这些异常(而不仅仅是发出用户必须处理的错误的信号),您可能需要创建详细说明错误类型的适当子类。

class InvalidTokenException : ErrorInScriptException {}
class NoStringVarException : ErrorInScriptException {}
...

但除非这些例外旨在让代码对不同的错误作出不同的反应,否则我认为这没有多大意义。对于用户来说,异常消息是相关的,并且可以使用任何Exception类来实现。

答案 1 :(得分:2)

你为什么要抛出异常?

我没有理由告诉你为什么要这样做(如果你打算按照你的例子那样做)。

  • 您没有为用户提供处理异常的机会,因为您对所有错误使用相同的异常。
  • 您不提供任何有助于用户查找错误在脚本中的位置的上下文信息。

我至少会提供像throw new ErrorInScriptException("Line 312 is missing a colon");

这样的上下文信息

更新以回复评论

您应该在问题中提供该信息。

我认为您的处理很好,因为您添加了上下文信息。除非您的脚本解释器的用户将尝试处理错误。在这种情况下,您应该提供更具体的例外。