上一篇的一元二次方程求根的例子,让我想起了一件事。一元二次方程求根的程序,如果遇到Delta<0,则无解,函数不能返回值。在这个例子中,print打印一条提示信息,然后在求平方根的过程中引发异常。这样处理,马马虎虎也算处理好了。例子详见,https://blog.csdn.net/aaasssdddd96/article/details/136867786
当然有些不满意的地方。因为在打印Delta<0的地方,已经知道计算要出问题了,但是不管,故意让程序执行下去,直到在内部真的引发一个异常。必然的。引发的时候又输出了一条信息。这信息微观上准确,宏观上可能让人迷惑。
所以,要不要引进明确的异常机制? 如果引进,怎么做?
明显的做法有2种。1是增加一个叫作exception()的内部函数。遇到Delta<0后,print打印一条提示信息,然后调用无参数的exception()触发异常,或者exception()接受一个提示信息做参数,这样就省下了print语句。
func Delta(a,b,c)
{return b*b-4*a*c;
}func root(a, b, c, neg)
{d= Delta(a,b,c);if(d<0) { print "Delta <0"; exception();}return (-b +(neg? -d**0.5: d**0.5))/(2*a);
}
这样做还是有些不满意。因为内部函数都统一有一个参数,采用无参数的exception()多了一个需要特殊处理的例外。而如果传一个字符串参数给exception(),也产生了一个需要特殊处理的例外, 因为所有的函数都只接受‘数’做参数,这里需要接受字符串参数。
所以,考虑第2种方法。引入Exception 语句。Exception 语句跟print语句是不是很像?这种方法只需要新增一个关键字,Exception。然后用它来代替print。Exception直接看成print。这样基本上没什么工作需要做了。当然print完成以后会自动引发一个Exception功能。遇到Exception后,后面的return 语句就不执行了。这里,稍微有点不满的是,跟C语言有了一点差别,C语言没有Exception语句。
func Delta(a,b,c)
{return b*b-4*a*c;
}func root(a, b, c, neg)
{d= Delta(a,b,c);if(d<0) { exception "Delta <0"; }return (-b +(neg? -d**0.5: d**0.5))/(2*a);
}
print语句可以容纳多个输出了。当然exception 也可以了。
...if (d<0) {exception a,"x**2 +",b,"x +", c,"= 0; Delta<0.";}
exception可以容纳多个输出。又如果exception的输出中调用的函数,表达式中又遇到异常会怎么样?exception的输出被打断,结果仍然是异常。
这样看,解释程序增加一个Exception功能并没有难度。简直太简单了。简单的简直不想动手去做。嗯!现在就偷个懒,以后真需要,就去做一下。