Законно ли выбрасывать одно и то же исключение по разным причинам? - PullRequest
0 голосов
/ 08 декабря 2011

Этому коду 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 ]

5 голосов
/ 08 декабря 2011

Обычно это нормально. Однако, если вы хотите, чтобы эти исключения были перехвачены и обработаны кодом (вместо того, чтобы просто сигнализировать об ошибке, с которой пользователь должен иметь дело), ​​вы можете создать соответствующие подклассы, подробно описывающие тип ошибки.

* 1003 Т.е. *

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

Но если эти исключения не предназначены для того, чтобы код реагировал на разные ошибки по-разному, я не думаю, что это имеет большой смысл. Для пользователя важно сообщение об исключении, которое может быть достигнуто с помощью любого класса исключения.

2 голосов
/ 08 декабря 2011

Почему вы бросаете исключения?

Я не вижу причины, по которой вам следует это делать (если вы собираетесь это сделать, как в вашем примере).

  • Вы не предоставляете пользователю возможность обработать исключение, так как вы используете одно и то же исключение для всех ошибок.
  • Вы не предоставляете никакой контекстной информации, которая поможет пользователю найти, где в скрипте ошибка.

Я бы, по крайней мере, предоставил контекстную информацию, такую ​​как throw new ErrorInScriptException("Line 312 is missing a colon");

Обновление в ответ на комментарий

Вы должны были предоставить эту информацию в вопросе.

Я думаю, что вы хорошо справляетесь, поскольку вы добавляете контекстную информацию.Если только пользователь вашего интерпретатора сценариев не попытается обработать ошибки.В этом случае вы должны предоставить более конкретные исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...