2015-12-14 2 views
0

У меня есть метод, который вызывается из класса ServerConnectionTools. Он должен возвращать коллекцию ManagementObjects, однако, если сервер, почему мы пытаемся выполнить запрос, недоступен, он выдает COMException.Не удается вернуть ManagementObjectCollection из метода

Я попытался установить соединение в область внутри try/catch, но это значит, что значение ret не будет установлено, если оно не выполнено перед назначением.

Какой был бы лучший способ справиться с этим? До сих пор я пытался заставить функциональность работать, а не фокусироваться на обработке ошибок, поэтому я все еще изучаю веревки!

Я также не знаю, должен ли я поднимать событие в COMException, чтобы уведомить вызывающий класс о том, что соединение не удалось, или обработать его каким-либо другим способом ... Я бы подумал, что поймать COMException в вызывающем классе будет быть неправильным подходом?

public ManagementObjectCollection GetServicesList() 
    { 

     try 
     { 
      // Connect our scope to the actual WMI scope 
      this.Scope.Connect(); 

      // Query system for Eclipse Services 
      ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Service WHERE Caption LIKE 'xxx%'"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(this.Scope, query); 
      ManagementObjectCollection ret = searcher.Get(); 
     } 
     catch (COMException ex) 
     { 
      ServerConnectionFailure?.Invoke(this, null); 
     } 


     return ret; 
    } 

Любые мысли приветствуются!

Приветствия Dave

+0

Если вы не хотите ловить COMException в классе вызывающего, вы можете бросить любое исключение, что вам нравится в улове (COMException экс). – 3per

ответ

0

Keep декларация ret вне try блока, так что функция она получит его доступность. теперь он принадлежит только блоку try .

Таким образом, ваш метод подпись будет иметь следующий вид:

public ManagementObjectCollection GetServicesList() 
    { 
     ManagementObjectCollection ret=new ManagementObjectCollection(); //declaration of the collection 
     try 
     { 
      this.Scope.Connect(); 
      ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Service WHERE Caption LIKE 'xxx%'"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(this.Scope, query); 
      ret = searcher.Get(); 
     } 
     catch (COMException ex) 
     { 
      ServerConnectionFailure?.Invoke(this, null); 
     } 
     return ret; 
    } 
+0

Вот где я ошибся ... Я пытался «ManagementObjectCollection ret = new ManagementObjectCollection();», но вы не можете его создать таким образом. Ему также не нравится присваивать ему значение перед возвратом, поэтому я просто присвоил null! Приветствую вас за помощь. – dc799

Смежные вопросы