异常处理在编程中,其作用不太明显。通常在 C++游戏编程中,不推荐使用异常。异常是在发生错误时,对错误进行处理的方式。在 C 语言中,错误的处理相对来说很直接:通过执行之后,立即进行判断,来进行错误处理。这样的错误处理方式,造成的结果是代码冗余,充斥着错误处理逻辑代码:大部分都是在进行错误判别处理。因此为了避免满篇 if(error)的方式,让函数有多个出口点,有人使用 goto 进行集中处理错误,保持单一出口。
C++为此进行了改进,改为throw
+try..catch
,try 内块进行正常逻辑处理,当出现错误时,使用 catch 捕获错误,进行集中处理。这种方式是if(error) goto ..
的变种,但比之更加简洁,正常处理的逻辑代码中,不需再充斥if(error)
这样的代码,集中注意力于逻辑代码即可。对于callee
函数,会自行判别自己的出错时机,当出错时,需要显式throw
抛出异常。如果callee
不抛出异常,则在caller
中catch
时,是捕获不到异常的。但对于 C++而言,主要是编写高性能代码,特别是在游戏中,异常的实现方式不仅占用内存,而且因为是集中处理异常,如果需要对错误进行细致判断,则需要大量的不同exception
,这也会造成低效率错误处理。同时,还需再考虑一件事:如果catch
处理块中,再次抛出了异常,该当如何?所以在游戏开发中,往往不建议使用异常处理,而采用 C 语言的错误处理方式。
Java、C#对 C++更升一级,采用throw
+try..catch..finally
进行错误挽救处理,在常规 C++的错误处理之后,在catch
处理块中,有可能再次发生异常,那么再发生异常时可使用finally
处理块,来进行清理,保证对错误进行挽救。在 ruby 中,实现的关键字为:raise
+rescue..ensure..retry
。
在 go 语言中,实现异常类似于 C 语言处理机制,但也稍微实现了异常处理,使用panic()
+ recover()
函数方式。panic
抛出异常,recover
捕获异常。其方式可理解为 C++throw
+ catch
。