Поскольку блок try и блок catch являются 2 разными блоками.
В следующем коде вы ожидали бы, что s, определенный в блоке A, будет видимым в блоке B?
{ // block A
string s = "dude";
}
{ // block B
Console.Out.WriteLine(s); // or printf or whatever
}
В целом, прагмы предпочтительнее, так как они будут игнорироваться другими компиляторами и при компиляции без включенного OpenACC. Вызовы API времени выполнения должны быть защищены макросом, таким как "#ifdef _OPENACC", чтобы поддерживать переносимость.
Хотя, если вы не возражаете против добавления макросохранителей или потери переносимости, то это в основном вопрос стиля. Функционально они эквивалентны.