public RobotSpeedData(string str)
{
if (StringCheck(str))
{
string s = str.Trim();
s=s.Remove(0, 1);
s=s.Remove(s.Length - 1);
string[] spds = s.Split(',');
Tcp = Convert.ToInt32(spds[0]);
Ori = Convert.ToInt32(spds[1]);
Leax = Convert.ToInt32(spds[2]);
Reax = Convert.ToInt32(spds[3]);
}
else
{
Tcp = 0;
Ori = 0;
Leax = 0;
Reax = 0;
throw new Exception("the str can't convert to RobotSpeedData");
}
}
//这段代码如果进入else中,将不会返回一个为0的新实例
//而是一个null
/网上资料:
构造函数中抛出异常时概括性总结
(1) C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常;
(2) 构造函数中抛出异常将导致对象的析构函数不被执行;
(3) 当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构;
(4) 其是还是那句话, “C++的异常处理不会破坏任何一条面向对象的特性!”。
4 关于异常的其他问题
① 过度使用异常 :首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常。这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。另外,异常机制的效率很差。
② 将异常与普通错误区分开:对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。只有外部的不能确定和预知的运行时错误才需要使用异常。
③ 异常对象中包含的信息 :一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。并且后一种包含的信息是前一种的超集。