如何捕获错误:
 我写了一个自动还原的sp,大体流程是这样的:1先还原全备份(此步借,则直接跳出),2再还原日志备份,3无论日志备份还原是否成功最终都还原db为online状态。
  我的问题主要是集中在日志的还原,但当指定的日志文件不存在或还原的日志序列不正确时,将收到错误信息(我试了发现此异常无法try-catch到)。若在查询窗口中调用此sp,即是还原日志时发生这样的报错信息,但脚本仍可向下全部执行完,此时不影响整个sp的执行。
 但是我将sp放在job中调用时,当指定的日志文件不存在或还原的日志序列不正确时,作业将报错,并且脚本将不能被完全执行。即无法再执行将db变为online状态的操作。
 有谁知道遇到此问题吗?可以分离一下吗?

解决方案 »

  1.   

    错误是有严重级别区分的,try catch并不能处理所有级别的错误。
    最好的作法是事先判断。可以预知的错误不能用try catch,  它只用来处理不可预知的错误, 这是所有语言中开发时要注意的。
    可预知的错误要先检测, 比如明明知道文件可能不存在,还try catch, 就算可以处理也会有额外很多的消耗
      

  2.   

    先写一个事务来判断  如果可以 继续执行 否则回滚4楼FC说得很清楚了  TRY...CATCH不是万能的 
      

  3.   

    可以在作业中将操作分为三个步骤,步骤一执行数据还原,并定义步骤成功继续执行下一步骤;步骤二还原日志备份,步骤失败和成功都继续执行下一步骤;步骤三让数据库上线。try...catch 只能捕获严重度 11 至 19 的错误。
      

  4.   

    既然是放JOB 那就分成多个TASK,即使出错也可以让他继续向下执行
      

  5.   

    谢谢大家的建议。
      我之所以没有将此三步分到作业中的三步,是因为我需要还原的不止一个DB,在这三步外有个外循环。即根据配置表还原所有要还原的DB.
      同时放在一个sp中(其实是两个sp,即在还原全备份的sp_full中调用sp_log),方便部署到作业中。
      有知道能解决我这样的问题的,可以共享一下(写详细一点噢!谢啦!)
      

  6.   

    日志还原找不到备份文件的错误,其严重度是 16,是可以被 try...catch 捕获到的。
      

  7.   

      兄弟,我试了下,restore database/log 当文件不存在或日志序列错误时的确可以try...catch,但可惜的是catch到了,但系统仍然后报错。这在query中不影响执行,但要是放到job中执行,job就会失败,导至整个脚本不能被全部执行。
      奇怪的是当在job中收到报错后,作业停止执行。而脚本并不是在报错点就停止了,而后在脚本出现异常的语句后,还会向下执行一小段代码。(我测试了N次都是这样,而向下执行到哪并不统一,即向下执行多少行不固定)。
      我实在找不到根据,只能猜想了,是不是因为当发生异常时,系统做两种事:1。继续执行出现异常点以后的脚本 2。系统将异常抛向job异常处理程序。而job接到异常后,则1。job报错;2。同时使仍在执行的脚本中断。
      有谁可以试验一下。
      

  8.   

    补充一下,采用litespeed还原也出现这样的问题。即采用litespeed提供的xp_restore_database,xp_restore_log。这两个sp虽都有返回值:0成功,非0失败。
      在文件不存在或日志还原序列不正确时,是可以接收到非0的返回值,但同时也会收到系统的异常信息,
    这在窗口中也不会影响脚本继续向下执行,但在job中执行就会报错,问题同上。
      

  9.   

    自顶一个。
      找不到好的解决办法。我就只能在作业在发二步了。
      在第一步正常调用sp,并将报错信息插入到表中。当第一步报错后,转到第二步。
      第二步,据所报错信息进行相应处理:
        1.错误属于全备份错,则抛出异常,让job再次报错,从而job失败。
        2.错误属于日志还原错误,则执行online,并赋权。若本过程无异常则,job执行成功。否则也报job失败。
      关键是我现在还不想这么做,我想知道在job中报错的机制是什么?有谁知道吗,有什么文章可以介绍看一下的?