如何捕获错误:
我写了一个自动还原的sp,大体流程是这样的:1先还原全备份(此步借,则直接跳出),2再还原日志备份,3无论日志备份还原是否成功最终都还原db为online状态。
我的问题主要是集中在日志的还原,但当指定的日志文件不存在或还原的日志序列不正确时,将收到错误信息(我试了发现此异常无法try-catch到)。若在查询窗口中调用此sp,即是还原日志时发生这样的报错信息,但脚本仍可向下全部执行完,此时不影响整个sp的执行。
但是我将sp放在job中调用时,当指定的日志文件不存在或还原的日志序列不正确时,作业将报错,并且脚本将不能被完全执行。即无法再执行将db变为online状态的操作。
有谁知道遇到此问题吗?可以分离一下吗?
我写了一个自动还原的sp,大体流程是这样的:1先还原全备份(此步借,则直接跳出),2再还原日志备份,3无论日志备份还原是否成功最终都还原db为online状态。
我的问题主要是集中在日志的还原,但当指定的日志文件不存在或还原的日志序列不正确时,将收到错误信息(我试了发现此异常无法try-catch到)。若在查询窗口中调用此sp,即是还原日志时发生这样的报错信息,但脚本仍可向下全部执行完,此时不影响整个sp的执行。
但是我将sp放在job中调用时,当指定的日志文件不存在或还原的日志序列不正确时,作业将报错,并且脚本将不能被完全执行。即无法再执行将db变为online状态的操作。
有谁知道遇到此问题吗?可以分离一下吗?
最好的作法是事先判断。可以预知的错误不能用try catch, 它只用来处理不可预知的错误, 这是所有语言中开发时要注意的。
可预知的错误要先检测, 比如明明知道文件可能不存在,还try catch, 就算可以处理也会有额外很多的消耗
我之所以没有将此三步分到作业中的三步,是因为我需要还原的不止一个DB,在这三步外有个外循环。即根据配置表还原所有要还原的DB.
同时放在一个sp中(其实是两个sp,即在还原全备份的sp_full中调用sp_log),方便部署到作业中。
有知道能解决我这样的问题的,可以共享一下(写详细一点噢!谢啦!)
奇怪的是当在job中收到报错后,作业停止执行。而脚本并不是在报错点就停止了,而后在脚本出现异常的语句后,还会向下执行一小段代码。(我测试了N次都是这样,而向下执行到哪并不统一,即向下执行多少行不固定)。
我实在找不到根据,只能猜想了,是不是因为当发生异常时,系统做两种事:1。继续执行出现异常点以后的脚本 2。系统将异常抛向job异常处理程序。而job接到异常后,则1。job报错;2。同时使仍在执行的脚本中断。
有谁可以试验一下。
在文件不存在或日志还原序列不正确时,是可以接收到非0的返回值,但同时也会收到系统的异常信息,
这在窗口中也不会影响脚本继续向下执行,但在job中执行就会报错,问题同上。
找不到好的解决办法。我就只能在作业在发二步了。
在第一步正常调用sp,并将报错信息插入到表中。当第一步报错后,转到第二步。
第二步,据所报错信息进行相应处理:
1.错误属于全备份错,则抛出异常,让job再次报错,从而job失败。
2.错误属于日志还原错误,则执行online,并赋权。若本过程无异常则,job执行成功。否则也报job失败。
关键是我现在还不想这么做,我想知道在job中报错的机制是什么?有谁知道吗,有什么文章可以介绍看一下的?