2 xumenger xumenger 于 2016.05.09 10:54 提问

线程Suspend为什么停不下来?GetLastError获取的错误不能被try except捕获吗

##说明

  • Delphi版本是6
  • 这个问题是在客户的环境上出现的,现在没办法再通过改代码的方式去验证

GetLastError

  • GetLastError是获取调用系统API出现的报错信息
  • 这种类型的错误能够被 try except 方式的异常机制捕获吗?

线程

  • 使用Delphi实现的一个线程,代码如下
  • GetLastError获取的错误码是2,并没有捕获异常,但是线程持续运行,说明suspend没有起作用
  • 另外,线程反复输出如下信息,并没有报错,说明压缩成功,走到suspend方法调用的代码行
正在压缩文件,请稍候...
压缩文件完成
GetLastError:2
正在压缩文件,请稍候...
压缩文件完成
GetLastError:2
正在压缩文件,请稍候...
压缩文件完成
GetLastError:2
……
……

为什么线程没有正常suspend而停止运行,反而是一直循环,根本停不下来

procedure TZipTask.Execute;
var
  bSuccess: Boolean;
  index: Integer;
  iError: Integer;
begin
  while not Terminated do
  begin
    try
      index := GetCurrentThreadId;
      SendMsg('正在压缩文件,请稍候...');
      ......//这里调用封装的一个压缩文件的API
      if bSuccess then
        SendMsg('压缩文件完成')
      else
        SendMsg('停止压缩文件');
    except
      on e:Exception do
      begin
        SendMsg('压缩文件出错' + E.Message);
      end;
    end;
    bComplete := True;
    Self.Suspend;
    iError := GetLastError;
    SendMsg('GetLastError:' + IntToStr(iError));
  end;
end;
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
python try except 捕获所有异常
python 捕获所有异常 try except 1 2 3 4 5 try:       a=b       b=c   except Exception,e:       print Exception,":",e 方法二:采用traceback模块查看异常 1 2 3
C/C++异常捕获try{}catch(...) // __try{ //...}__except(EXCEPTION_EXECUTE_HANDLER){ //...}
// TestVS2003.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include VOID TestException_MS(VOID); VOID TestException_StdCPP(VOID); int _tmain(int argc
Python异常处理和多线程
异常处理 异常在程序的运行过程中发生的不正常的事件,会中断正在运行的程序。 多线程 由于每个进程只要干一件事,所以,一个进程只要有一个线程,当然,想 Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多线程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂得交替运行,看起来就像同时执行一样
带有多个except 的try语句,处理多个异常的except语句
带有多个except的try 语句 >>> def self_float(obj):     try:         return float(obj)     except ValueError:         retval = none     return retval >>> self_float(1234) 1234.0 >>> def self_flo
python捕获多个Exception携带msg
python2.x有好几个地方不人性化,Exception是其中一个,刚开始是学py3的,后来好多开源lib都是2.x的,所以推荐初学者或者使用者使用2.x的 try扑捉多个exception时需要加括号,如果不加括号则视为exception的信息   #!/usr/bin/python def KelvinToFahrenheit(Temperature): temp = 0
C++ 异常捕获 try 和 __try的区别
抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:      throw 表达式;      如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的
多线程情况下如何捕获线程中的异常?
多线程情况下如何捕获线程中的异常?摘要: 本文主要介绍当使用ExecutorService来执行任务(Runnable)时,该如何正确的捕捉线程中的异常。 Thread类最佳实践: 写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理。在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的。
建议66:正确捕获多线程中的异常
建议66:正确捕获多线程中的异常 多线程的异常处理需要采用特殊的方式。一下这种方式会存在问题: try { Thread t = new Thread((ThreadStart)delegate { throw new Except
python 异常 try-except句型
1.句型 try:      表达式 1(如果表达式,可以成功执行,则执行,跳到 finally 语句) except ExpectErrorType, Argument:   (表达式1 没有做成功,且正好是 ExpectErrorType 的错误情况,则执行)      表达式2 (如何处理这种异常情况) else:  (try succ && 上
Python多层异常的捕获
参考: https://mozillazg.github.io/2016/08/python-the-right-way-to-catch-exception-then-reraise-another-exception.html