Threadを使ってみる(エラーハンドリング)

■概要
 スレッド内で発生した未処理の例外を補足するための仕組みを下記の順で試してみる。
 1.グローバルエラーハンドラーを設定しないでスレッドから例外をthrowする。
  → デフォルトの動作を調べる
 2.グローバルエラーハンドラーを設定してスレッドから例外をthrowする。
  → 独自のハンドラーが呼び出されているか調べる

■lib/dll
 PocoFoundation.lib
 PocoFoundation.dll

■使用クラス
 Poco::Thread
 Poco::Runnable
 Poco::ThreadPool
 Poco::ErrorHandler

■1.デフォルトの動作 サンプル

class Hoge : public Poco::Runnable{
public: void run(){ throw std::exception("hoge exception"); }
};
 
int _tmain(int argc, _TCHAR* argv[]){
  Poco::Thread thd; Hoge hoge;
  thd.start(hoge); thd.join();
  getchar();
}

■1.デフォルトの動作 実行結果
Poco::Debugger::enter() が呼び出される。

■2.独自EventHandlerの使用 サンプル

class MyHandler : public Poco::ErrorHandler{
public: virtual void exception(const Poco::Exception& exc){ std::cout << "Poco Exception : " << exc.displayText() << std::endl; }
  virtual void exception(const std::exception& exc){ std::cout << "std exception : " << exc.what() << std::endl; }
  virtual void exception(){ std::cout << "other exception" << std::endl; }
};
 
class Hoge : public Poco::Runnable{
public: void run(){ throw std::exception("hoge1"); }
};
 
class Hoge2 : public Poco::Runnable{
public: void run(){ throw Poco::Exception("hoge2"); }
};
 
int _tmain(int argc, _TCHAR* argv[]){ MyHandler handler; auto old = Poco::ErrorHandler::set(&handler);
  // 1. std exception { Poco::Thread thd; Hoge hoge;
  thd.start(hoge); thd.join(); }
  // 2. PocoException { Poco::Thread thd; Hoge2 hoge;
  thd.start(hoge); thd.join(); }
  Poco::ErrorHandler::set(old);
}

■2.独自EventHandlerの使用 実行結果

> std exception : hoge1
> Poco Exception : Exception: hoge2

MyHandler が呼び出される。