如果用下面的方式,执行到第一个panic就会跳出for循环
只能输出第一个匹配项,然后退出for循环。
那么如何保证在for循环处理完panic不退出循环,直到打印完所有满足条件的数值?
golang的panic被恢复后,能继续执行比recover更早的defer,或者返回到recover函数的调用方,然后继续执行下去。
所以,我们可以把panic和recover放到单独的函数中,然后在for循环里调用这个函数,这个函数panic并恢复后,能返回到调用方for循环并继续循环下去。
执行结果是所有0到100的所有符合panic条件的都能正确处理,for循环没有异常退出:
golang的panic属于非常严重的错误,一旦panic没有recover的话,程序就退出了。一般避免主动panic,影响程序稳定性。
recover函数要放在defer里面,并且只能恢复同一个goroutine的并且是直接调用链函数发生的panic。recover不能恢复上一层函数的panic。
panic\nMemory ID这个代表了重启代码的ID
panic就是异常,
而我们的应用程序也会出现异常,包括由运行时检测到的异常或者应用开发者自己抛出的异常。
异常在一些其他语言中,如c++、java,被叫做Exception,主要由抛出异常和捕获异常两部分组成。
异常在go语言中,叫做panic,且由panic和recover方法组成,panic用来抛出,recover用来从panic中恢复。
panic是go的内置函数,它可以终止程序的正常执行流程并发出panic。比如当函数F调用panic,F的执行将被终止,并返回到调用者。对调用者而言,F就像调用者直接调用了panic。该过程一直跟随堆栈向上,直到当前goroutine中的所有函数都返回,此时程序崩溃。panic可以通过直接调用panic产生。同时也可能由运行时的错误所产生,例如数组越界访问。
panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。
recover()用于将panic的信息捕捉。recover必须定义在panic之前的defer语句中。在这种情况下,当panic被触发时,该goroutine不会简单的终止,而是会执行在它之前定义的defer语句。
建议每起一个goroutine,都defer统一捕获下异常
谨记用defer统一捕获异常只对当前的goroutine有效,goroutine的异常并不会向上传递给main主函数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)