中作中遇到异常情况怎么处理下怎处理 www.bkjia.com

今天看啥 热点:
这段时间一直在忙着赶项目,由DAL+WCF+WinForm几层组成。其中数据库使用的MySQL+MySQL.Data.dll Driver。不过在使用中,经常碰到如下错误:
接收对 http://localhost/***.svc 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。
有时也会出现如下错误
基础连接已经关闭: 连接被意外关闭。
经过仔细核对发现,每当发生MySql.Data.MySqlClient.MySqlException异常时,就会报这个错误。网上找了半天也没有找到解决方案,后来使用Trace Viewer跟踪才发现是MySqlException序列化时出现了问题:
municationException: 尝试对参数 http://tempuri.org/ 进行序列化时出错: result。InnerException 消息是&不应为数据协定名称为&MySqlException:http://schemas.datacontract.org/2004/07/MySql.Data.MySqlClient&的类型&MySql.Data.MySqlClient.MySqlException&。请考虑使用 DataContractResolver,或将任何未知类型以静态方式添加到已知类型的列表。例如,可以使用 KnownTypeAttribute 特性,或者将未知类型添加到传递给 DataContractSerializer 的已知类型列表。&。有关详细信息,请参见 InnerException。& System.Runtime.Serialization.SerializationException:.......
其中result是一个存储操作结果的类实例,它横跨DAL、WCF、WinForm三层,用以存储一个完整操作中发现的异常及信息。里面对可能发生的异常做了包装,它的结构如下(其它属性及构造函数等没有列出):
[DataContract]
public class Result
&&& [DataMember]
&&& public boll Success
&&&&&&& get {return this.}
&&&&&&& set {this.success =}
&&& private E
&&& [DataMember]
&&& publice Exception Exception
&&&&&&& get {return this.}
&&&&&&& set {this.exception =}
当DAL层中涉及SQL语句的执行发生错误时,result.Exception类型实际为MySqlException。虽然在Result类定义时已经声明[DataContract],不过序列化时仍然出错,头疼!查看MySqlException的定义如下:
[Serializable]
public sealed class MySqlException : DbException
&&& public int Number { }
明明是已经声明了[Serializable]特性,而且查看MySQL.Data.dll 文档,发现其在0.7版本的时候,就已经支持序列化了,却仍然不可在WCF中序列化,只能再找原因。
根据错误的提示,在IService的契约声明接口中,加上了[ServiceKnownType(typeof(MySql.Data.MySqlClient.MySqlException))]声明,可到头来结果还是一样不起作用。但是如果发生的异常不是MySqlException类型时,就不会报序列化错误。
对比Exception和MySqlException的实现,发现虽然都声明了[Serializable]特性,但MySqlException却没有实现序列化和逆序列化的函数。问题很可能出现在这个地方。
不过由于没有MySQL.Data.dll 的源代码,无法让添加这两个函数,只得新建一个异常类CustomException存放在Result。其代码如下:
[Serializable]&&&
public class CustomException : ISerializable,Exception
&&& public override string Message
&&&&&&& get
&&&&&&&&&&& return this.
&&& private string stackT
&&& public override string StackTrace
&&&&&&& get
&&&&&&&&&&& return this.stackT
&&& public CustomException() { }
&&& public CustomException(string exceptionMessage, string exceptionStackTrace)
&&&&&&& this.message = exceptionM
&&&&&&& this.stackTrace = exceptionStackT
&&&& 以下序列化和逆序列化中,只保存了Message和StackTrace
&&& protected CustomException(SerializationInfo info, StreamingContext context)
&&&&&&& this.message = info.GetString(&Message&);
&&&&&&& this.stackTrace = info.GetString(&StackTraceString&);
&&& public override void GetObjectData(SerializationInfo info, StreamingContext context)
&&&&&&& info.AddValue(&Message&, this.message);
&&&&&&& info.AddValue(&StackTraceString&, this.stackTrace);
&&& public override string ToString()
&&&&&&& if (string.IsNullOrEmpty(this.message))
&&&&&&&&&&& return string.E
&&&&&&& return this.message.ToString();
之所以override定义Message和StackTrace,是为能对它们俩重写,因为Exception类中,定义的StackTrace是只读的,Message也只能在构造函数中赋值。此外,此处只定义了这两个属性,是因为项目中只用到了Exception中的这两个属性,一般情况下,这两个属性也已经足够查找异常信息了。
当然最主要的地方,还是要实现一个构造函数,用来序列化,以及GetObjectData 方法设置序列化对象的替代值。
再次跟踪执行,当产生MySqlException时,Result对象可以正常从DAL-&WCF-&WinForm。OK啦!
总结:这个问题,的确是折磨了我好几天,由于是对WCF头一次在项目中使用,对它的了解也不多。如果不是看到使用Trace Viewer,还不会找到问题的本质所在。看来.NET下的异常提示,有时候也不一定就是问题的产生点,就像编译代码一样,少个逗号,提示的信息却是五花八门。
---------------------------------------------
作者:Ritchie(乞戈)
暂无相关文章
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
Asp.Net教程最近更新今天看啥 热点:
记一次流量异常处理前两天接到一个做开发的朋友电话,说他们客户一台服务器开机后,所有一个网段的机器上网都变慢了,他远程操作这台服务器也一卡一卡的。我第一反应就是机器被人攻击过了,因为我之前也遇到过类似的现象。大概都是tomcat管理密码设置的比较弱,被人上传了一些war包,导致服务器拼命往外发包,或者是被人恶意上传了一些php文件,也是往外发送大量的数据包。总而言之,往外发送大量数据包基本都是被人攻击过啦!下面看看我是怎么处理的。1、首先我给他一个脚本,确认一下是网卡异常流量引起。注意网卡改成你的外网网卡名称。while : ; dotime=`date "+%Y-%m-%d %H:%M:%S"`rx_before=`ifconfig eth0|sed -n "8"p|awk '{print $2}'|cut -c7-`tx_before=`ifconfig eth0|sed -n "8"p|awk '{print $6}'|cut -c7-`sleep 2rx_after=`ifconfig eth0|sed -n "8"p|awk '{print $2}'|cut -c7-`tx_after=`ifconfig eth0|sed -n "8"p|awk '{print $6}'|cut -c7-`rx_result=$[(rx_after-rx_before)/256]tx_result=$[(tx_after-tx_before)/256]echo "$time Now_In_Speed: "$rx_result"kbps Now_OUt_Speed: "$tx_result"kbps"sleep 2done然后运行这个脚本sh traffic.sh执行之后我们会看到偶尔流出的流量惊人。 13:32:01 Now_In_Speed: 5kbps Now_OUt_Speed: 0kbps 13:32:05 Now_In_Speed: 2kbps Now_OUt_Speed: 0kbps 13:32:09 Now_In_Speed: 1kbps Now_OUt_Speed: 0kbps 13:32:13 Now_In_Speed: 1kbps Now_OUt_Speed: 664567kbps 13:32:17 Now_In_Speed: 6kbps Now_OUt_Speed: 657895kbps 13:32:21 Now_In_Speed: 3kbps Now_OUt_Speed: 568462kbps 13:32:25 Now_In_Speed: 4kbps Now_OUt_Speed: 0kbps2、问题确定了,我们就好办了,上图我截图很少,而且我还发现了很有规律的事情,大概每二十多秒就会发出3-4个左右相当大的数据包。既然有规律那就肯定是后台有程序在运行。我查看了一下服务器是不是运行了tomcat?结果webapps目录下没有一些异常的jar包。我再查了一下是不是apache什么的,结果服务器上就只发现运行了oracle,根据自己的排查故障经验,我和朋友说了把oracle关闭。缩小故障查找范围,好确认不是oracle引起的。3、在用ps -ef看了一下基本看不出,因为进程太多了,而且很多系统的进程我也不认识,没有看到什么异常进程。只有一个tomcat进程,kill之后一会又起来了,很奇怪。肯定是什么守护程序一直启动。4、上面说了一开机启动就会出现这个现象,那么还肯定是启动服务或者启动脚本里面写了什么代码,结果rc.local文件也正常。那么看/etc/init.d目录下的启动脚本,有没有新增的或者可疑的?果然发现了一个functions和DbSecuritySpt文件,我将这两个文件移走,然后故障依旧。看了一下DbSecuritySpt文件里面内容:#!/bin/bash/usr/local/apache-tomcat-6.0.44/webapps/eei/gfty初步一看这是一个很正常的脚本文件啊!一般病毒文件都是打不开的。问了我朋友说不是他们写的,那我只能将这个文件移走,然后也很二逼似的把那个functions文件也移走了,结果他们重启机器后,告诉我服务器起不来啦!截图如下:一看上图的报错我心想肯定是那个functions文件移走报错了。不过还好这是个虚拟机,我远程连接宿主机上。然后在上图界面输入root密码后,执行mount -o remount rw /后将functions文件移到/etc/init.d目录下重新启动。但是重启还是报错,说要检查文件系统块文件,又执行fsck -y /dev/sda后提示重启,重启后系统正常运行。没有tomcat那个进程了,但是还是偶尔往外拼命往外发包啊!5、我又上网查了一下很多网友说是将/tmp目录下有一些的文件里面写了PID号,但是我根据这些PID号没有找到这些进程,我把这两个文件移走了。重启系统故障依旧。而且操作很卡真的很恶心,加上我自己的笔记本一上午关机7次,应该硬件老化的原因,比较2010年买的。哎!此处心中一万个草泥马飘过。6、又咨询了朋友说iftop工具能看的出来,我试了也不行,爆卡,后来又是是iptraf工具,这两个工具都没安装,又花了很多安装时间,结果也看不出来啊!拿一个iptraf工具我们看看,如下图所示:7、又看了一下chkconfig开机启动有没有异常的服务,一看服务太多了,也很难发现。8、我在想是不是每次连续发送几个大包的时候是不是那个进程也会占用很高的CPU使用率呢?再一边观察流量脚本运行的情况,一边又执行top看看是不是哪个进程导致。有一个getty进程偶尔能跑到70%多,结果一查看是有6个终端,然后关闭了多余的终端,但是还是异常。也没发现别的进程占用很高的CPU使用率。9、最后我想用netstat -an | more测试,一个一个排查当前服务器开放端口,因为我朋友说客户也不是很懂linux,开放了很多端口暴露在互联网上。发现了一个xxxx.57.145.221:6001异常,然后我查看了一下这个51545端口对应的进程,如下所示:这个进程执行的正是getty命令,说明和我上面一个getty进程偶尔跑到70%多使用率,查的正好符合。我尝试将这个1587进程号kill掉,再观察一段时间脚本流出流量基本为0了,也就是正常了。也就是说这台服务器通过51545端口去连接互联网上的119.147.145.221这台服务器的6001端口,查看了这个IP地址是广东电信的。但是事情还没有完结,上面说了肯定是开机启动程序里面运行的,而且这个目的119.147.145.221地址肯定是在病毒文件里面隐藏的。我进到/etc/rc.d目录下看了一下:看样子每个启动级别都被人置放病毒文件啦!都是软件连哈!不过这个文件被我第四步的时候移走了,然后我们还看到了一个可疑的selinux文件,因为它和DbSecuritySpt文件的时间戳和别的启动脚本文件不一样。这就测试你的眼睛尖不尖了哈~~再看看这个/usr/bin/bsd-port目录下的东东哈!赶紧删除/etc/init.d/selinux文件和/usr/bin/bsd-port目录。然后重启再试试看,系统一切正常!网卡流量也一切正常。然后修改root密码,但是很遗憾这里查不出是因为系统的漏洞还是程序的漏洞导致被恶意上传代码文件的。故障处理总结:1、服务器一定要尽少量的使用密码登录,最好是密钥加密码登录。2、少开一些和业务无关的端口。3、查问题一定要用排除法。眼睛要尖。4、还是对系统很多脚本和进程不是很熟悉。4、虽然解决了,但是这个机器还是被人上传过的,不确定是不是还会有一些不稳定的因素,建议最好还是重新安装系统。
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&&&
jQuery最近更新document.write('&&&&');
请输入你要查询的网站:
百度权重查询
您的查询太频繁了,请稍后查询! 谢谢您的使用
最近查询:
& 爱站网 版权所有
About Aizhan今天看啥 热点:
查看一下内存兼不兼容,一般都是这个问题。还有就是查看一下最近有没有下载软件与这个软件程序冲突。
应用程序错误的原因和解决方法内存条坏了--更换内存条双内存不兼容--使用同品牌的内存或只用一条内存散热问题--加强机箱内部的散热驱动问题--重装驱动。如果是新系统,要先安装主板驱动软件损坏--重装软件 软件有BUG--打补丁或用最新的版本。软件和系统不兼容--给软件打上补丁或者试试系统的兼容模式 软件和软件之间有冲突--如果最近安装了什么新软件,卸载了试试 软件要使用到其它相关的软件有问题--重装相关软件。病毒问题--杀毒软件与系统或软件冲突--由于杀毒软件是进入底层监控系统的,可能与一些软件冲突,卸载了换用兼容性好的杀毒软件(比如金山金山毒霸2011版sp6)。 这个问题,经常出现在windows2000和XP系统上,Windows 2000/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似Windows 98里的非法操作,系统为保持稳定,就会出现上述情况 &复制来的,版权归原作者 /thread-.html
应该是程序乱了,你重新下载一下试试
解决程序错误,内存不能为read( written)的问题 的最简单的办法: 1、硬件上的原因,主要是内存条不兼容,更换内存。 2、系统或其它软件引起的,可用下述方法处理: (1) 系统本身有问题,及时安装官方发行的补丁,必要时重装系统。 (2) 病毒问题,杀毒 ;杀毒软件与其它软件冲突,卸载有问题的软件。 (3)运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks 下,应该只有一个正常的键值{AEB-11d0-97EE-00C04FD91972}, 将其他的删除。 (4)试用命令排除 开始-运行- 输入cmd-- 回车,在命令提示符下输入下面命令 for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1 怕输入错误,可以复制这条指令,然后在命令提示符后击鼠标右键,打“粘贴”,回车,耐心等待,直到屏幕滚动停止为止。 传个附件给你试试,下载后双击运行即可,保证好用 。
固件以及系统等等因素的异常都有可能造成
相关搜索:
相关阅读:
相关频道:
电脑知识最近更新今天看啥 热点:
这个话题不大,但是很能体现出程序员的内功~各种框架工具那都是招式兵刃,我们一定不能把内功的修炼给忽视了,否则绝难打通任督二脉~嘎嘎~扯远了~
异常分为两类:checked & unchecked exception
先看一下几个常见的java中的unchecked excetion(RuntimeException)
ArithmeticException
ClassCastException
IndexOutOfBoundsException
IllegalArgumentException
NullPointerException
上面的几种异常类型可以引申出RuntimeException的使用场景--
RuntimeException在正常的程序执行中是不应该出现的,无论程序的运行场景是什么样的~
RuntimeException可以看做是一种错误,理论上上层程序是可以检测并避免的~~如果上层程序员不负责任,那么不好意思,下层程序就用抛出RuntimeException的方式来响应你~~~
checked exception相比RuntimeException来说,更多的是给上层传递了一些信息,比如:
UserNotFoundException
PasswordErrorException
并且强制要求上层程序一定给出在遇到checked exception的时候的处理逻辑。就是说,我们认为在遇到checked exception的时候上层程序是走到了一个相对比较少见的情形,但是这仍然是可以接受的.可以理解为一种另类的分支语句~~~
但是如果可以使用分支语句解决的,我们还是尽量采用分支来解决而不是去使用异常,估计这一点也是C#这种语言不提供checked exception这种异常的原因之一
对于异常处理的额外几点:
1、系统边界处,如在WEB中与前端交互的Controller中,在为其他系统提供的接口处,都要注意捕获所有异常,然后把异常转换为约定格式的交互数据
2、返回给前端的信息与log信息不应该一样,比如我们可以写一个Controller层的AOP处理逻辑来捕获所有的异常
public class BaseC extends Controller {
& & protected static final Log log = LogFactory.getLog(BaseC.class);
& & @Catch(Throwable.class)
& & public static void handleThrowable(Throwable throwable) {
& & & & log.error(ExceptionUtils.getStackTrace(throwable));
& & & & renderJSON(new ReturnData(false, &Unknown Error~~mail to ,3ks!&, throwable.getMessage()));
3、异常链问题:
异常在上层抛出的时候的处理原则:如果当前类处理不了,那就继续往上抛,如果所有的类都处理不了,比如DBException,就直接给用户一个提示就好了,但是在这个异常链处理过程中,异常不应该丢失,记log,继续throw
4、类库或者模块应该定义自己的异常基类,比如jdbc那套接口,有一个公共的异常基类:SQLException,然后再根据具体的情况抛出定制化的异常,提供尽量详细的信息,比如:
SQLTimeoutException
SQLFeatureNotSupportedException
SQLInvalidAuthorizationSpecException
5、Thinking in java的作者说:大多数时候,异常类其实只需要一个良好定义的类名~~我们在设计异常类的命名时一定要做到准确清晰~~
本文首发于百度运维空间】
/ops_bd/blog/item/93b4d93f0a2f0eedb311c718.html
关注百度技术沙龙】
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
Java编程最近更新}

我要回帖

更多关于 遇到异常情况怎么处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信