/// <summary> /// Runtime error. Look for ones generated by our script - normal occurrence which the user should know about. /// </summary> /// <param name="args"></param> /// <param name="compileDir"></param> ScriptError ProcessScriptRuntimeError(Surface.RuntimeErrorEventArgs args, string compileDir) { ScriptError err = null; // Locate the offending frame. string srcFile = ""; int srcLine = -1; StackTrace st = new StackTrace(args.Exception, true); StackFrame sf = null; for (int i = 0; i < st.FrameCount; i++) { StackFrame stf = st.GetFrame(i); if (stf.GetFileName() != null && stf.GetFileName().ToUpper().Contains(compileDir.ToUpper())) { sf = stf; break; } } if (sf != null) { // Dig out generated file parts. string genFile = sf.GetFileName(); int genLine = sf.GetFileLineNumber() - 1; // Open the generated file and dig out the source file and line. string[] genLines = File.ReadAllLines(genFile); srcFile = genLines[0].Trim().Replace("//", ""); int ind = genLines[genLine].LastIndexOf("//"); if (ind != -1) { string sl = genLines[genLine].Substring(ind + 2); int.TryParse(sl, out srcLine); } err = new ScriptError() { ErrorType = ScriptErrorType.Runtime, SourceFile = srcFile, LineNumber = srcLine, Message = args.Exception.Message }; } else // unknown? { err = new ScriptError() { ErrorType = ScriptErrorType.Runtime, SourceFile = "", LineNumber = -1, Message = args.Exception.Message }; } return(err); }
/// <summary> /// Runtime error. Look for ones generated by our script - normal occurrence which the user should know about. /// </summary> /// <param name="args"></param> void ScriptRuntimeError(Surface.RuntimeErrorEventArgs args) { ProcessPlay(PlayCommand.Stop, false); SetCompileStatus(false); ScriptError err = ProcessScriptRuntimeError(args, _compileTempDir); if (err != null) { _logger.Error(err.ToString()); } }