try...catch
блоки, как правило, рекомендуется использовать меньше, и это не зависит от языка, который вы используете.
Основной причиной этого является стоимость catch
блоков. Еще одна причина заключается в том, что когда вы заключаете много операторов в один блок try...catch
, в блоке catch
вы не можете быть уверены, в чем именно заключается основная проблема.
Лучше использовать методы, такие как проверка входных данных или блоки if...else
, чтобы уменьшить вероятность возникновения исключения (ошибки). Например, если вы хотите работать с номером, который взят у пользователя, вместо использования try...catch
, вы можете использовать:
if (isNaN(numberVariable))
{
alert('you should enter a valid number');
}
Согласно ответу CodeTrawler , решение состоит в том, чтобы ввести следующее в окно проводника:
% systemroot% \ Microsoft.NET \ Framework
Затем выполните поиск для:
Mscorlib.dll
... и щелкните правой кнопкой мыши / перейдите на вкладку версии для каждого результата.
Как ни странно, я написал код, чтобы сделать это еще раз, когда вышла версия 1.1 (что это было, семь лет назад?), И немного подправил его, когда версия 2.0 вышел. Я не смотрел на это годами, так как мы больше не управляем нашими серверами.
Это не надежно, но я все равно публикую его, потому что считаю это забавным; в том, что это проще сделать в .NET и еще проще - в оболочке Power.
bool GetFileVersion(LPCTSTR filename,WORD *majorPart,WORD *minorPart,WORD *buildPart,WORD *privatePart)
{
DWORD dwHandle;
DWORD dwLen = GetFileVersionInfoSize(filename,&dwHandle);
if (dwLen) {
LPBYTE lpData = new BYTE[dwLen];
if (lpData) {
if (GetFileVersionInfo(filename,0,dwLen,lpData)) {
UINT uLen;
VS_FIXEDFILEINFO *lpBuffer;
VerQueryValue(lpData,_T("\\"),(LPVOID*)&lpBuffer,&uLen);
*majorPart = HIWORD(lpBuffer->dwFileVersionMS);
*minorPart = LOWORD(lpBuffer->dwFileVersionMS);
*buildPart = HIWORD(lpBuffer->dwFileVersionLS);
*privatePart = LOWORD(lpBuffer->dwFileVersionLS);
delete[] lpData;
return true;
}
}
}
return false;
}
int _tmain(int argc,_TCHAR* argv[])
{
_TCHAR filename[MAX_PATH];
_TCHAR frameworkroot[MAX_PATH];
if (!GetEnvironmentVariable(_T("systemroot"),frameworkroot,MAX_PATH))
return 1;
_tcscat_s(frameworkroot,_T("\\Microsoft.NET\\Framework\\*"));
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(frameworkroot,&FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
return 2;
do {
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
_tcslen(FindFileData.cAlternateFileName) != 0) {
_tcsncpy_s(filename,frameworkroot,_tcslen(frameworkroot)-1);
filename[_tcslen(frameworkroot)] = 0;
_tcscat_s(filename,FindFileData.cFileName);
_tcscat_s(filename,_T("\\mscorlib.dll"));
WORD majorPart,minorPart,buildPart,privatePart;
if (GetFileVersion(filename,&majorPart,&minorPart,&buildPart,&privatePart )) {
_tprintf(_T("%d.%d.%d.%d\r\n"),majorPart,minorPart,buildPart,privatePart);
}
}
} while (FindNextFile(hFind,&FindFileData) != 0);
FindClose(hFind);
return 0;
}
Также см. Вопрос о переполнении стека Как определить, какие версии .NET Framework и пакеты обновления установлены? , в котором также упоминается:
Есть официальный ответ Microsoft на этот вопрос в статье базы знаний [Как определить, какие версии и уровни пакетов обновления Microsoft .NET Framework установлены] [2]
Идентификатор статьи: 318785 - Последняя проверка: 7 ноября 2008 г. - Версия : 20.1 Как определить, какие версии .NET Framework установлены и были ли применены пакеты обновления.
К сожалению, похоже, что это не работает, потому что версия mscorlib.dll
в каталоге 2.0 имеет версию 2.0, и нет версии mscorlib.dll
ни в одном из них. каталоги 3.0 или 3.5, даже если установлен 3.5 SP1 ... Почему официальный ответ Microsoft может быть настолько дезинформирован?