落后的return与前卫的finally
相信学编程的你对return非常的熟悉吧,至少现在对我来说,只知道现在的编程语言中除了pascal以外,似乎都在用return来返回一个值给调用者。但是很可惜,随着编程语言的不断演进,return却一直止步不前。
return的用处其实很简单,就是返回一个值,并且立即调回到原调用处。但是实际上这个语句具有两个功能,就是返回值和回跳。而使用pascal中的result却不同。在pascal中给result设置一个返回值之后并不会立即返回,而是一直等到函数执行结束,或者是调用了exit来强制调出函数,返回原位置。
这就带来了一些问题。在计算机语言发展的早期,动态对象很少见的时候,使用return是没什么的,反正危害不大,而且其危害完全可以靠多写几行代码来实现。也就是说在函数内部分配了一个动态对象,或者申请了一个资源的句柄。而这些资源是需要及时释放的,因为到了函数之外,所有对这些资源的引用都不再有效。所以可以在使用return的编程语言中设置一个临时变量,在合适的位置保存下来需要返回的值,然后进行释放资源的操作。最后再返回对应的值。尽管是个办法,但是很麻烦。bad smell。
但是对于pascal中的result方式就不同了。可以使用result在合适的位置保存需要返回的值,然后从容的执行释放资源的操作,函数结束后,会自动将返回值传给调用者。
Delphi的IDE我很讨厌,不过说实在的,Delphi中使用Pascal语言有很多地方我是非常欣赏的。比如对属性的赋值和取值操作还会自动调用对应的方法,内置集合类型等等,这些在现在都是很先进的功能。只怪现在的Borland走错了路线了。
在谈谈finally,这个才是比较现代又很先进的处理方式。尽管它还是相当新的一个概念,以致于很多编程语言中不允许捕捉错误和执行finally放在同一个try中。不过还好,看的出很多语言正在向这个方向发展,支持捕捉错误和finally一同出现的try。
在执行try时,如果发生了错误,则无论发生了什么错误都马上避开错误,执行finally中的资源释放代码。在执行完finally之后再将错误向上抛出。在没有发生错误时也是要执行finally中的语句的。这样就确保了无论发生什么,都会执行finally中的资源释放语句。
当然万事无绝对,如果在执行try中代码时遇到了严重到突然死机或者突然重启之类的错误,finally还是没有办法的。一般来说对finally的无论是指程序还有执行能力的时候。
据个绝对一点的例子。在try中遇到return语句时,程序执行到return语句时会马上跳转到finally语句执行,然后再返回。
从这里看finally还是很先进的,有效的使用finally可以让程序的可读性和逻辑都有很好的改进。
相信学编程的你对return非常的熟悉吧,至少现在对我来说,只知道现在的编程语言中除了pascal以外,似乎都在用return来返回一个值给调用者。但是很可惜,随着编程语言的不断演进,return却一直止步不前。
return的用处其实很简单,就是返回一个值,并且立即调回到原调用处。但是实际上这个语句具有两个功能,就是返回值和回跳。而使用pascal中的result却不同。在pascal中给result设置一个返回值之后并不会立即返回,而是一直等到函数执行结束,或者是调用了exit来强制调出函数,返回原位置。
这就带来了一些问题。在计算机语言发展的早期,动态对象很少见的时候,使用return是没什么的,反正危害不大,而且其危害完全可以靠多写几行代码来实现。也就是说在函数内部分配了一个动态对象,或者申请了一个资源的句柄。而这些资源是需要及时释放的,因为到了函数之外,所有对这些资源的引用都不再有效。所以可以在使用return的编程语言中设置一个临时变量,在合适的位置保存下来需要返回的值,然后进行释放资源的操作。最后再返回对应的值。尽管是个办法,但是很麻烦。bad smell。
但是对于pascal中的result方式就不同了。可以使用result在合适的位置保存需要返回的值,然后从容的执行释放资源的操作,函数结束后,会自动将返回值传给调用者。
Delphi的IDE我很讨厌,不过说实在的,Delphi中使用Pascal语言有很多地方我是非常欣赏的。比如对属性的赋值和取值操作还会自动调用对应的方法,内置集合类型等等,这些在现在都是很先进的功能。只怪现在的Borland走错了路线了。
在谈谈finally,这个才是比较现代又很先进的处理方式。尽管它还是相当新的一个概念,以致于很多编程语言中不允许捕捉错误和执行finally放在同一个try中。不过还好,看的出很多语言正在向这个方向发展,支持捕捉错误和finally一同出现的try。
在执行try时,如果发生了错误,则无论发生了什么错误都马上避开错误,执行finally中的资源释放代码。在执行完finally之后再将错误向上抛出。在没有发生错误时也是要执行finally中的语句的。这样就确保了无论发生什么,都会执行finally中的资源释放语句。
当然万事无绝对,如果在执行try中代码时遇到了严重到突然死机或者突然重启之类的错误,finally还是没有办法的。一般来说对finally的无论是指程序还有执行能力的时候。
据个绝对一点的例子。在try中遇到return语句时,程序执行到return语句时会马上跳转到finally语句执行,然后再返回。
从这里看finally还是很先进的,有效的使用finally可以让程序的可读性和逻辑都有很好的改进。