これは C++ の try - catch とは別に __try - __except で処理することができます。
さて、この独自拡張で問題になること、というかメンドクサイことナンバーワンは、
1つの関数で try と __try を同時に使えないことではないでしょうか?
つまり、こういうことです。
void f()
{
try {
__try { // error C2713: 関数ごとに許されている例外ハンドルのフォームは 1 つです。
} __except(EXCEPTION_EXECUTE_HANDLER) {
}
} catch(...) {
}
}
void g()
{
__try {
} __except(EXCEPTION_EXECUTE_HANDLER) {
}
try { // error C2713: 関数ごとに許されている例外ハンドルのフォームは 1 つです。
} catch(...) {
}
}
void fa()
{
__try {
} __except(EXCEPTION_EXECUTE_HANDLER) {
}
}
void fb()
{
try {
fa(); // OK
} catch(...) {
}
}
lambda があるじゃない
Visual Studio でも lambda が使えるようになってます。これ使えばわざわざ関数にしなくても済みます!void f()
{
try {
[]() {
__try {}
__except(EXCEPTION_EXECUTE_HANDLER) {}
}();
} __except(EXCEPTION_EXECUTE_HANDLER) {
}
}
やったね!
とはならない…
VS2012/2013 でエラー
上記コードは VS2015 なら問題なくビルドできます。しかし、VS2012/2013 ではエラーとなってしまいます。
(エラー内容は lambda 使う前と同じ、「error C2713: 関数ごとに許されている例外ハンドルのフォームは 1 つです。」)
もう少し詳しく書くと、こう。
void f()
{
__try {
[]() {
try {}
catch( ... ) {}
}();
} __except( EXCEPTION_EXECUTE_HANDLER ) {
}
}
void g()
{
try {
[]() {
__try {} // error C2713: 関数ごとに許されている例外ハンドルのフォームは 1 つです。
__except( EXCEPTION_EXECUTE_HANDLER ) {}
}();
} catch( ... ) {
}
}
void h()
{
auto x = []() {
__try {}
__except( EXCEPTION_EXECUTE_HANDLER ) {}
};
try {
x();
} catch( ... ) {
}
}
__try の中に try がある場合は OK
try の中に __try があるのは NG
lambda が try の外で定義されいれば OK
という感じでした。

