System.threading <一> [EAggregateException]

 //事件过程指针
  TExceptionHandlerEvent = procedure (const AException: Exception; var Handled: Boolean) of object;
  //匿名方法
  TExceptionHandlerProc = reference to procedure (const AException: Exception; var Handled: Boolean);
 EAggregateException = class(Exception)
 {class↓ 内部类型TExceptionEnumerator 协助管理异常FInnerExceptions数组}
  public type
    TExceptionEnumerator = class //枚举器
    private
      FIndex: Integer; //FInnerExceptions数组的游标
      FException: EAggregateException; //拥有者
      function GetCurrent: Exception; inline;//获取游标指向的Exception对象
      //构建函数  参数是其拥有者
      constructor Create(const AException: EAggregateException);
    public
      //游标后移
      function MoveNext: Boolean; inline;
      //游标指向的Exception对象
      property Current: Exception read GetCurrent;
    end;
  {class↑}
  private
    FInnerExceptions: TArray<Exception>;//内部存储异常数据数组
    function GetCount: Integer; inline;//返回异常个数
    function GetInnerException(Index: Integer): Exception; inline;//获取指定异常
    procedure ExtractExceptionsToList(const AList: TList<Exception>);//导出异常到AList
    //三种构建函数
    constructor Create(const AMessage: string; const AList: TList<Exception>); overload;
  public
    constructor Create(const AExceptionArray: array of Exception); overload;
    constructor Create(const AMessage: string; const AExceptionArray: array of Exception); overload;
    //解构函数
    destructor Destroy; override;
    //获取异常枚举器TExceptionEnumerator
    function GetEnumerator: TExceptionEnumerator; inline;
    // Handle函数 支持2中形式 匿名方法与事件指针
    procedure Handle(AExceptionHandlerEvent: TExceptionHandlerEvent); overload;
    procedure Handle(const AExceptionHandlerProc: TExceptionHandlerProc); overload;
    // FInnerExceptions所有异常信息字符串
    function ToString: string; override;
    property Count: Integer read GetCount;
    property InnerExceptions[Index: Integer]: Exception read GetInnerException; default;
  end;

//----------
implementation
//----------

procedure EAggregateException.Handle(AExceptionHandlerEvent: TExceptionHandlerEvent);
begin
  Handle(
    // 将事件指针转换成匿名函数,呼叫同名重载Handle函数
    procedure (const AException: Exception; var Handled: Boolean)
    begin
      AExceptionHandlerEvent(AException, Handled);
    end);
end;

// 参数  异常处理函数
// 如果异常完全处理完,则不触发异常信息。
//TExceptionHandlerProc = reference to procedure (const AException: Exception//注解:参数1:异常对象; var Handled: Boolean//注解:参数2:Out型参数 携带true返回则代表异常被成功处理);
procedure EAggregateException.Handle(const AExceptionHandlerProc: TExceptionHandlerProc);
var
  I: Integer;
  Handled: Boolean;
  List: TList<Exception>;
begin
  List := nil;
  try
    for I := 0 to Length(FInnerExceptions) - 1 do
    begin
      Handled := False;
      AExceptionHandlerProc(FInnerExceptions[I], Handled);
      if not Handled then
      begin
        if List = nil then
          List := TList<Exception>.Create;
        List.Add(FInnerExceptions[I]);
      end;
    end;
    if List <> nil then
    begin
      FInnerExceptions := nil;
      raise EAggregateException.Create(Message, List);
    end;
  finally
    List.Free;
  end;
end;
时间: 2024-10-23 11:56:05

System.threading <一> [EAggregateException]的相关文章

System.Threading

线程:定义为可执行应用程序中的基本执行单元. 应用程序域:一个应用程序内可能有多个线程. 上下文:一个线程可以移动到一个特定的上下文的实体 导入命名空间: //得到正在执行这个方法的线程 Thread currThread = Thread.CurrentThread; //获取正在承载当前线程的应用程序 AppDomain ad = Thread.GetDomain(); //获取当前操作线程所处的上下文 System.Runtime.Remoting.Contexts.Context ct

vs2013c#测试using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1_CXY { class Program { stati

首先安装Unit Test Generator.方法为:工具->扩展和更新->联机->搜索“图标为装有蓝色液体的小试管.Unit Test Generator”, 编写代码,生成一个新的类,编写构造函数 与 add()函数.代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Co

System.Threading.ThreadStateException

异常:"System.Threading.ThreadStateException"在未处理的异常类型 System.Windows.Forms.dll 发生 其它信息: 在能够调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 仅仅有将调试器附加到该进程才会引发此异常. 分析:线程间操作产生的异常. 解决方式1:Control.CheckForIllegalCrossThreadCalls =

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的. 2.它是一个基于Form的计时器3.创建之后,你可以使用Interval设置Tick之间的跨

Delphi并行库System.Threading 之ITask 1

不知什么时候,也许是XE8,也许是XE8之前 .Delphi里面多了个System.Threading的并行库. 虽然己经有非常棒的第三方并行库QWorker,但我还是更喜欢官方的东西. 下面是一段使用System.Threading中ITask的代码 procedure TForm3.SpeedButton1Click(Sender: TObject); var tasks: array of ITask; value: Integer; LTask:ITask; X,Y:INTEGER; b

System.Threading.Timer

GLog.WLog("_thdTimer before"); _thdTimer = new System.Threading.Timer(new TimerCallback(TimerProc)); //2秒后开始执行计时器:每3秒执行一次 _thdTimer.Change(2000,3000); GLog.WLog("_thdTimer after"); private void TimerProc(object state) { try { GLog.WLog

C#错误之 System.Threading.ThreadAbortException:正在中止线程

参考:http://www.cnblogs.com/chendaoyin/archive/2013/06/27/3159211.html 1.开启一个子线程 1 //开启一个子线程,子线程调用方法 Method 2 Thread th = new Thread(Method); 3 th.IsBackground = true; 4 th.Start(); 2.线程处理函数 1 public void Method() 2 { 3 try 4 { } 5 catch(Exception ex)

例说定时器System.Threading.Timer

本文通过实例演示System.Threading.Timer的使用方法. 下面是完整的实例代码. using System; using System.Windows; namespace ThreadingTimerExp { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { System.Threading.Timer timer;

using System.Threading;

1 /// <summary> 2 /// 执行动作:耗时而已 3 /// </summary> 4 private void TestThread(string threadName) 5 { 6 Console.WriteLine("TestThread Start Name={2}当前线程的id:{0},当前时间为{1},", 7 System.Threading.Thread.CurrentThread.ManagedThreadId, DateTime