zoukankan      html  css  js  c++  java
  • Try Catch Finally 中Finally的代码在什么时候不被执行

    近日执行一段陈旧的代码,一个Batch执行EXE,每日无限循环。

    唯一可以停掉该Batch的方法,就是直接将进程杀掉,或者在Batch的CMD窗口关掉X按钮。

     而后,进程中永远都会增加一个Excel的执行进程。 必须手动关闭。 

     想来十分愚蠢,但细读元代码后,发现在处理中有Try Catch Finally 的语句。但其Finally中

    原本希望的执行的,关掉Excel进程的部分,并没有正常执行。

    细读http://thedailywtf.com/articles/My-Tales后。

    归结为:

    在采取杀死进程(包括点击X按钮,Application.Exit()), 关电源, 以及系统内存泄漏等异常情况下, Finally 中

    的语句不会被执行。只有正常的异常,比如文件不存在,数据库断连接等系统可预测级别的异常,才会进入Finally

    因此,考虑Finally的执行语句时, 需要慎重考虑。

    但是也有例外:例如Office的Excel 进程,一旦打开,普通的方法全部无效。

    包括用资源回收,MarshelRelease(obj) ,Quit(), 等等统统无效。最后采用杀死进程结局。

    简例余下:

     pasting

    Private Function useSomeExcel(ByVal Excelfilename As String) 
      Dim objExcel As Excel.Application
      Dim objWorkBook As Excel.Workbook
      Dim objWorkSheets As Excel.Worksheet
    
      Dim datestart As Date = Date.Now
      objExcel = CreateObject("Excel.Application") 'This opens...  
      objWorkBook = objExcel.Workbooks.Open(Excelfilename) ' ... excel process
      Dim dateEnd As Date = Date.Now
      End_Excel_App(datestart, dateEnd) ' This closes excel proces
    End Function

     pasting

    Private Sub End_Excel_App(datestart As Date, dateEnd As Date)
        Dim xlp() As Process = Process.GetProcessesByName("EXCEL")
        For Each Process As Process In xlp
         If Process.StartTime >= datestart And Process.StartTime <= dateEnd Then
           Process.Kill()
           Exit For
         End If
        Next
      End Sub

     Excel 使用方法:

    http://qiita.com/midori44/items/acab9106e6dad9653e73 

    Love it, and you live without it
  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/tomclock/p/7459031.html
Copyright © 2011-2022 走看看