Для начала небольшая симуляция в качестве разминки: запускаем клиент Dynamics AX 4.0 и открываем из него дополнительно 2 рабочие области.
Закрываем рабочую область с номером 2 - таким образом остаются 2 окна: 'Microsoft Dynamics AX - 1...' и 'Microsoft Dynamics AX - 3...' (
с 'дыркой' в последовательности).
Не запуская приведенный ниже job попробуйте ответить что будет выведено в infolog:
количество строк и текст?
X++:
static void jbEnumerateWorkspace(Args _args)
{
HWND hWndWorkspace ;
int workspaceNum ;
#define.WorkspaceCount(3)
;
try
{
for( workspaceNum =1 ; workspaceNum <=#WorkspaceCount; workspaceNum++ )
{
info( strfmt( "Workspace num: %1", workspaceNum ) ) ;
hWndWorkspace = infolog.hWnd( workspaceNum ) ;
info( hWndWorkspace ? strfmt( "Workspace HWND: %1", hWndWorkspace) : "Workspace HWND: oops :(" ) ;
}
}
catch
{
info( strfmt( "catched in %1", funcname() ) ) ;
}
info( 'finished' ) ;
}
Теперь запускаем job и можно проверить свои выводы.

Тестировалось на 2 приложениях: kernel version
4.0.2163.0 и kernel version
4.0.2501.116
Результат, который был получен в infolog на этих релизах:
Цитата:
Workspace num: 1
Workspace HWND: 1234567
Workspace num: 2
т.е. вызов
infolog.hWnd(...) на второй итерации цикла с номером несуществующей (закрытой уже) рабочей области привел к 'аварийному' завершению выполнения прикладного кода, при этом эта ситуация не была перехвачена в блоке
catch.

Аналогичная ситуация с вызовом другой функции ожидающей в качестве параметра workspaceNum: infolog.taskPane( ... ) (отличие - infolog.taskPane( 0 ) отрабатывает корректно)
С 'наскоку' не обнаружил в DAX 4.0 штатной функциональности позволяющей проверить валидность workspaceNum или получить их текущий набор (функция
infolog.getWorkspaceList() возвращает контейнер с HWND открытых рабочих областей)
P.S. Склонен отнести это bug'ам если приведенный сценарий воспроизводится и на более поздних версиях kernel Dynamics Ax 4.0.