Исключение C # catch игнорируется, поэтому приложение уничтожается

#c# #try-catch #registry

#c# #попробуйте-поймайте #реестр

Вопрос:

Мне нужно создать приложение на WinForm C # в качестве моего окончательного проекта программирования. Проект направлен на более эффективное управление реестром, чтобы пользователю было проще редактировать значения.

Проблема в том, что когда я читаю, существует ли строка UninstallString или нет, функция по какой-то причине не просматривает catch внутри try при сбое (и это не удается, поскольку приложение не является 64-разрядным, поэтому к значению реестра нужно обращаться по-другому)

 public bool ValueExists(string Key, string Value)
    {
        try
        {
            try
            {
                RegistryKey rk = Registry.LocalMachine.OpenSubKey(Key);
                return rk.GetValue(Value) != null; //Error happens here when selected 64-bit application. System.NullReferenceException: 'Object reference not set to an instance of an object.'
            }
            catch (NullReferenceException ex)
            {
                RegistryKey regkey64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
                RegistryKey rk64 = regkey64.OpenSubKey(Value);
                return regkey64.OpenSubKey(Key).GetValue(Value) != null;
            }
        }
        catch
        {
            return false;
        }
    }
  

System.NullReferenceException: ‘Ссылка на объект не установлена для экземпляра объекта.’ — Это ошибка, и я ЗНАЮ, что это происходит, потому что я выбираю 64-разрядное приложение, но по какой-то причине оно игнорирует catch.

Комментарии:

1. Получите трассировку стека, где это происходит

2. Поставьте точку останова в этой строке. Равно rk null? Если да, то почему и обработайте его.

3. Оно нечитаемо, поскольку это 64-разрядное значение реестра (то есть, если я выберу 32-разрядное приложение, это исключение не произойдет), поэтому я сделал это исключение. Что еще я могу сделать, чтобы справиться с этим?

4. так что это rk null?

5. Как вы установили 64-разрядность своего приложения? Не могли бы вы показать код / проект? Вы уверены, что rk это значение равно null (с использованием отладчика)?

Ответ №1:

Пользователь по имени Ричард Диминг решил проблему для меня в CodeProject

Он предложил совершенно другой подход. Вместо того, чтобы использовать catch, он проверяет, является ли процесс 64-разрядным, и таким образом он указывает коду, следует ли принудительно считывать 64-разрядное значение реестра или нет (зависит от выбранной программы). Это его код (с исправлением, которое я сделал):

 public bool ValueExists(string Key, string Value)
    {
        using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(Key, false))
        {
            if (rk != null) return rk.GetValue(Value) != null;
        }

        if (Environment.Is64BitOperatingSystem amp;amp; !Environment.Is64BitProcess)
        {
            RegistryKey regkey64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
            return regkey64.OpenSubKey(Key).GetValue(Value) != null;
        }

        return false;
    }