dever.cn中的异常处理

文章对比ASP时代,指出Java和.NET中异常处理机制有很大进步。介绍了异常源的struct定义,以及setError、saveError等主要异常处理方法,setError分解异常信息交saveError处理,saveError还处理自定义异常,popError处理用户操作错误。

回想起靠关键字或错误代码定义异常的ASP时代,现在JAVA和.net中的异常处理机制实在是进步的太多了。 

先定义一个异常源的struct

 public struct ErrorItem
 {
  public string UserIp ;//用户IP
  public string Page ;//错误发生的页面
  public string Resource ;//错误源
  public string ErrorInfo ;//错误信息
  public DateTime ErrorTime ;//错误发生的时间
 }

以下是一些我用到的主要异常处理方法: 

public static void setError(Exception e)
  {
   System.Web.HttpContext hc = System.Web.HttpContext.Current;

   // 将捕获的异常实例分解并处理
   ErrorItem ei = new ErrorItem();

   ei.ErrorInfo = e.Message;
   ei.Resource = e.Source;
   ei.Page = hc.Request.Path;
   ei.UserIp = hc.Request.UserHostAddress.ToString();
   ei.ErrorTime = DateTime.Now;
   
   saveError(ei,true); //调用错误处理函数
}


  public static void saveError(ErrorItem errItem,bool isView)
  {
   // 将错误信息写库供显示用
   System.Web.HttpContext hc = System.Web.HttpContext.Current;
   string strSql = "update error set ------------" 
   SqlHandle.ExecuteUpdateQuery(strSql)

   ErrorHandle eh = new ErrorHandle()
   // 判断日志文件是否存在,不存在则新建
   eh.isExistLog()
   // 将错误信息写入日志文件
   XmlElement xErrorElement = xmlDoc.CreateElement("error") ;

   eh.AddXmlAttribute(xErrorElement,"time",errItem.ErrorTime.ToString());
   eh.AddXmlAttribute(xErrorElement,"resource",errItem.Resource);
   eh.AddXmlAttribute(xErrorElement,"page",errItem.Page);
   eh.AddXmlAttribute(xErrorElement,"ip",errItem.UserIp);
   xErrorElement.InnerText = errItem.ErrorInfo ;
   xmlRoot.AppendChild(xErrorElement) ;

   if(isView)
   {
    hc.Response.Redirect( DeverClass.getRoot("ErrorHandle.aspx") );
   }
  }

// 用弹出窗口弹出错误信息并自动回退
  public static void popError(string strError)
  {
   System.Web.HttpContext hc = System.Web.HttpContext.Current;
   hc.Response.Write(" ");
  }

  // 用弹出窗口弹出错误信息,第二个参数为返回页面
  public static void popError(string strError,string strRePage)
  {
   System.Web.HttpContext hc = System.Web.HttpContext.Current;
   hc.Response.Write(" ");
  }

setError方法处理的是程序中try{}中捕获的错误,将异常实例的信息分解后交给saveError来处理。saveError方法处理这些异常的同时也处理一些自定义的异常。参数isView控制是否要将错误显示给用户。

popError处理一些用户操作上的错误,比如说登陆时输入错误等,此类错误不影响程序运行,只要弹出个小窗口提示一下就OK。


异常处理一个很重要的环节是记录日志,将异常写到库里比较方便,但存在一个致命弱点,就是它会使数据库变的很大且难以控制,所以一般不推荐,我采用的方法是,将异常写到库里,注意是update而不是insert。这样库里永远就只有最新发生的一条异常。这条异常主要是显示给用户看的。异常写库的同时也将异常写到日志文件中,我写在一个XML文件中,查询历史记录时可直接显示XML文件中的内容。 

在程序中捕获异常是控制程序正常运转的好办法,但并不能解决所有问题,因为我们不能把整个程序包在一个try块中,或者程序里到处是try块,这样都是低效的,明智的做法是预测可能发生的异常并捕获,对于一些预测不到的错误就交给系统来帮我们捕捉吧。

修改Global.asax.cs中的Application_Error方法,这个方法是在发生错误时系统自动调用的,当然对于try{}块中的错误它是不处理,因为它的错误处理优先级低于用户自定义异常处理。下面是我改写的该函数

protected void Application_Error(Object sender, EventArgs e)
  {
      if(System.Configuration.ConfigurationSettings.AppSettings["ErrorView"].Equals("ON"))
     {
         System.Web.HttpContext hc = System.Web.HttpContext.Current;
         // 自定义错误信息
         ErrorItem ei = new ErrorItem();

         ei.ErrorInfo = "未捕获的错误";
         ei.Resource = "未知";
         ei.Page = hc.Request.Path;
         ei.UserIp = hc.Request.UserHostAddress.ToString();
         ei.ErrorTime = DateTime.Now;
         ErrorHandle.saveError( ei,true );  //此处为出错处理
     }
 }

函数的处理根据你的需要来写。最好是在处理前加一个判断,因为有的时候我们并不希望它执行,比如说调试阶段。在web.config中加个开关值就OK了。


   

如果你觉得这样很麻烦,又或者你根本就不在意那些未捕获的异常,那好吧,有一些工作你还是应该做的。修改web.config文件。

    defaultRedirect = "Error.aspx" 
    mode="On"   
    />  

现在你的程序看起来就完美多了,再也不会出现令用户不快的黄底黑字了。

以上这些方法为便于大家理解,我写的都比较简单,一些处理函数也省去了,比如说在将错误信息写库时,一定要过滤,因为错误信息中可能会包含单引号。

<think>好的,我现在需要帮助用户解决如何在自定义编辑器中嵌入Lua语言开发支持或配置Lua Language Server的问题。首先,我应该回顾用户提供的引用内容,看看有没有相关的信息。 引用[2]提到Lua是嵌入式语言,可以通过C函数库连接到主程序,主程序可以执行Lua代码、读写变量,注册C函数供Lua调用。这说明嵌入Lua的基本方法是通过Lua的C API。这可能涉及到初始化Lua状态、加载库、执行代码等步骤。 引用[3]提到在VSCode中搭建Lua开发环境,使用code runner插件运行代码。这可能涉及到Lua Language Server的配置,比如安装插件、设置路径等。虽然用户问的是自定义编辑器,但VSCode的配置方法可能有参考价值,尤其是Language Server Protocol(LSP)的使用。 用户的需求是在自定义编辑器中嵌入Lua支持,可能包括语法高亮、代码补全、调试等功能。这需要分步骤实现: 1. **嵌入Lua解释器**:根据引用[2],需要链接Lua的C库,初始化环境,执行代码。可能需要编写C/C++代码来集成Lua解释器,比如使用lua_open()创建状态,加载标准库,注册自定义函数等。 2. **语法高亮和代码分析**:自定义编辑器需要词法分析和语法高亮规则。可以编写或使用现有的Lua语法定义文件,比如使用正则表达式匹配关键字、字符串等。 3. **集成Lua Language Server**:LSP允许编辑器与语言服务器通信,提供智能提示、错误检查等功能。需要配置编辑器支持LSP,并启动Lua Language Server(如Emmylua或Sumneko Lua)。可能需要处理JSON-RPC通信,设置初始化参数,处理服务器的响应。 4. **调试支持**:可能需要集成调试器,比如使用Lua的debug库或第三方调试工具,设置断点、变量监视等功能。 在实现过程中,可能会遇到如何正确处理Lua的错误、管理内存、保持编辑器与语言服务器的同步等问题。需要参考Lua的官方文档和LSP的规范,确保各组件正确交互。 可能还需要考虑跨平台兼容性,比如不同操作系统的路径处理,动态库的加载方式等。另外,性能也是一个考虑因素,尤其是处理大型代码文件时的响应速度。 最后,测试各个功能模块,确保语法高亮正确,代码补全准确,调试功能稳定。可能需要用户提供具体的编辑器环境信息,比如是用什么语言开发的,是否有现有的插件系统等,来进一步定制解决方案。</think>### 如何在自定义编辑器中嵌入 Lua 语言开发支持 #### 一、核心实现步骤 1. **集成 Lua 解释器** - 通过 Lua C API 嵌入解释器: ```c lua_State *L = luaL_newstate(); // 创建 Lua 虚拟机 luaL_openlibs(L); // 加载标准库 ``` - 执行脚本示例: ```c luaL_dostring(L, "print('Hello from embedded Lua!')"); ``` 参考 Lua 官方文档实现脚本加载与错误处理[^2] 2. **语法高亮支持** - 使用正则表达式定义 Lua 语法规则: ```regex (function|end|if|then|else)\b // 关键字匹配 --.*$ // 单行注释 ``` - 开发语法高亮模块需适配编辑器框架的文本渲染接口 3. **Lua Language Server 集成** - 配置 LSP 客户端: ```json "lua-ls": { "command": "lua-language-server", "args": ["-E", "/path/to/main.lua"], "filetypes": ["lua"] } ``` - 需实现 LSP 协议的消息解析与响应机制[^3] 4. **调试支持** - 使用 Lua Debug 协议: ```lua debug.sethook() // 设置断点钩子 ``` - 开发调试适配器需遵循 DAP 规范 #### 二、进阶配置方案 1. **自定义 API 注入** ```c static int lua_print(lua_State *L) { const char *msg = luaL_checkstring(L, 1); editor_show_message(msg); // 调用编辑器接口 return 0; } lua_register(L, "editor_print", lua_print); ``` 2. **代码分析优化** - 集成 Luacheck 静态分析: ```bash luacheck --formatter plain --codes script.lua ``` - 建议使用 AST 解析实现深度代码检查 3. **性能监控** ```lua local start_time = os.clock() -- 执行目标代码 collectgarbage("collect") // 强制内存回收 print("Memory used:", collectgarbage("count") * 1024, "bytes") ``` #### 三、开发注意事项 1. 内存管理需严格遵循 `lua_newuserdatauv` 与 `lua_gc` 的配对使用 2. 多线程环境应使用 `lua_newthread` 创建独立上下文 3. 错误处理推荐封装 `lua_pcall` 与 `xpcall`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值