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