关于C/S客户端异常“clr20r3”的处理
来源:互联网 发布:淘宝奥特曼星计划 编辑:程序博客网 时间:2024/06/18 10:10
一、C/S 解决方案(以下任何一种方法)
<configuration> <runtime> <legacyUnhandledExceptionPolicy enabled="true" /> </runtime> </configuration>2. 在应用程序配置文件中,添加如下内容:
<configuration> <startup> <supportedRuntime version="v1.1.4322"/> </startup></configuration>
3. 使用Application.ThreadException事件在异常导致程序退出前截获异常。示例如下:
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]public static void Main(string[] args){ Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new ErrorHandlerForm());}
// 在主线程中产生异常
private void button1_Click(object sender, System.EventArgs e){ throw new ArgumentException("The parameter was invalid");}
// 创建产生异常的线程
private void button2_Click(object sender, System.EventArgs e){ ThreadStart newThreadStart = new ThreadStart(newThread_Execute); newThread = new Thread(newThreadStart); newThread.Start();}
// 产生异常的方法
void newThread_Execute(){ throw new Exception("The method or operation is not implemented.");}private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs t){ DialogResult result = DialogResult.Cancel; try { result = ShowThreadExceptionDialog("Windows Forms Error", t.Exception); } catch { try { MessageBox.Show("Fatal Windows Forms Error", "Fatal Windows Forms Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); } finally { Application.Exit(); } } if (result == DialogResult.Abort) Application.Exit();}
// 由于 UnhandledException 无法阻止应用程序终止,因而此示例只是在终止前将错误记录在应用程序事件日志中。
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){ try { Exception ex = (Exception)e.ExceptionObject; string errorMsg = "An application error occurred. Please contact the adminstrator " + "with the following information:/n/n"; if (!EventLog.SourceExists("ThreadException")) { EventLog.CreateEventSource("ThreadException", "Application"); } EventLog myLog = new EventLog(); myLog.Source = "ThreadException"; myLog.WriteEntry(errorMsg + ex.Message + "/n/nStack Trace:/n" + ex.StackTrace); } catch (Exception exc) { try { MessageBox.Show("Fatal Non-UI Error", "Fatal Non-UI Error. Could not write the error to the event log. Reason: " + exc.Message, MessageBoxButtons.OK, MessageBoxIcon.Stop); } finally { Application.Exit(); } }}private static DialogResult ShowThreadExceptionDialog(string title, Exception e){ string errorMsg = "An application error occurred. Please contact the adminstrator " + "with the following information:/n/n"; errorMsg = errorMsg + e.Message + "/n/nStack Trace:/n" + e.StackTrace; return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);}
二、B/S 解决方案(以下任何一种方法)
1. 在IE目录(C:/Program Files/Internet Explorer)下建立iexplore.exe.config文件,内容如下:
<?xml version="1.0"?> <configuration> <runtime> <legacyUnhandledExceptionPolicy enabled="true" /> </runtime> </configuration>
2. 不建议使用此方法,这将导致使用 framework 1.1 以后版本的程序在IE中报错。
建立同上的配置文件,但内容如下:
<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v1.1.4322"/> </startup></configuration>
3. 这个比较繁琐,分为三步:
(1)将下面的代码保存成文件,文件名为UnhandledExceptionModule.cs,路径是C:/Program Files/Microsoft Visual Studio 8/VC/
using System;using System.Diagnostics;using System.Globalization;using System.IO;using System.Runtime.InteropServices;using System.Text;using System.Threading;using System.Web; namespace WebMonitor { public class UnhandledExceptionModule: IHttpModule { static int _unhandledExceptionCount = 0; static string _sourceName = null; static object _initLock = new object(); static bool _initialized = false; public void Init(HttpApplication app) { // Do this one time for each AppDomain. if (!_initialized) { lock (_initLock) { if (!_initialized) { string webenginePath = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "webengine.dll"); if (!File.Exists(webenginePath)) { throw new Exception(String.Format(CultureInfo.InvariantCulture, "Failed to locate webengine.dll at '{0}'. This module requires .NET Framework 2.0.", webenginePath)); } FileVersionInfo ver = FileVersionInfo.GetVersionInfo(webenginePath); _sourceName = string.Format(CultureInfo.InvariantCulture, "ASP.NET {0}.{1}.{2}.0", ver.FileMajorPart, ver.FileMinorPart, ver.FileBuildPart); if (!EventLog.SourceExists(_sourceName)) { throw new Exception(String.Format(CultureInfo.InvariantCulture, "There is no EventLog source named '{0}'. This module requires .NET Framework 2.0.", _sourceName)); } AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); _initialized = true; } } } } public void Dispose() { } void OnUnhandledException(object o, UnhandledExceptionEventArgs e) { // Let this occur one time for each AppDomain. if (Interlocked.Exchange(ref _unhandledExceptionCount, 1) != 0) return; StringBuilder message = new StringBuilder("/r/n/r/nUnhandledException logged by UnhandledExceptionModule.dll:/r/n/r/nappId="); string appId = (string) AppDomain.CurrentDomain.GetData(".appId"); if (appId != null) { message.Append(appId); } Exception currentException = null; for (currentException = (Exception)e.ExceptionObject; currentException != null; currentException = currentException.InnerException) { message.AppendFormat("/r/n/r/ntype={0}/r/n/r/nmessage={1}/r/n/r/nstack=/r/n{2}/r/n/r/n", currentException.GetType().FullName, currentException.Message, currentException.StackTrace); } EventLog Log = new EventLog(); Log.Source = _sourceName; Log.WriteEntry(message.ToString(), EventLogEntryType.Error); } }}
(2)打开Visual Studio 2005的命令提示行窗口
输入Type sn.exe -k key.snk后回车
输入Type csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs后回车
输入gacutil.exe /if UnhandledExceptionModule.dll后回车
输入ngen install UnhandledExceptionModule.dll后回车
输入gacutil /l UnhandledExceptionModule后回车并将显示的”强名称”信息复制下来
(3)打开ASP.net应用程序的Web.config文件,将下面的XML加到里面。
注意:不包括”[]”,①可能是添加到<httpModules></httpModules>之间。
<add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule, [这里换为上面复制的强名称信息]" />
三、微软并不建议的解决方案
打开位于 %WINDIR%/Microsoft.NET/Framework/v2.0.50727 目录下的 Aspnet.config 文件,将属性 legacyUnhandledExceptionPolicy 的 enabled 设置为 true
四、跳出三界外——ActiveX
ActiveX 的特点决定了不可能去更改每个客户端的设置,采用 B/S 解决方案里的第 3 种方法也不行,至于行不通的原因,我想可能是因为 ActiveX 的子控件产生的异常直接
被 CLR 截获了,并没有传到最外层的 ActiveX 控件,这只是个人猜测,如果有清楚的朋友,还望指正。
最终,我也没找到在 ActiveX 情况的解决方法,但这却是我最需要的,无奈之下,重新检查代码,发现了其中的问题:在子线程中创建了控件,又将它添加到了主线程的 UI 上。
以前遇到这种情况,系统就会报错了,这次居然可以蒙混过关,最搞不懂的是在 framework 2.0 的 C/S 结构下也没有报错,偏偏在 IE(ActiveX) 里挂了。唉,都是宿主惹的祸。
- 关于C/S客户端异常“clr20r3”的处理
- Winform CLR20r3 异常处理。
- C/S客户端的响应处理流程
- 使用redis 编程C/S程序时候 在WIN SERVER2008 服务器机器上报错 CLR20r3 的错误
- 关于 CLR20r3 错误
- 关于cxf 连.net 的webservice生成客户端异常( undefined element declaration 's:schema')
- 关于object-c中的异常最基本的处理
- svn客户端异常的处理:authorization failed
- WCF回调已离线客户端的异常处理
- 关于ANSI C中的异常处理
- 关于c++异常处理
- 关于异常处理的讨论
- abap--关于异常的处理
- 关于异常处理的建议
- abap--关于异常的处理
- abap--关于异常的处理
- 关于struts的异常处理
- abap--关于异常的处理
- POJ 1356 Grandpa's Other Estate 笔记
- java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org
- QQ顶部消息与电话切换栏实现(UI美化)
- 15天的性能优化工作,5方面的调优经验
- 由一个简单需求到Linux环境下的syslog、unix domain socket
- 关于C/S客户端异常“clr20r3”的处理
- java 消息推送的比较
- Android版本更新知识(检测、升级)总结
- Next Permutation
- 算法—猜拳游戏
- (原创)HyperPacer使用技巧之集合点设置
- 微信公众号开发--微信JS-SDK扫一扫功能
- 阿里云centos修改ssh端口后连接失败
- SDUT 3812 离散题目18