объяснение, необходимое для исключений / классов - PullRequest
0 голосов
/ 10 января 2009

Рассмотрим следующий фрагмент:

  using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;


namespace ForumLogins {
    public class VBULLETIN {

        HttpWebRequest request;


        public void ForumLogins(string url) {          
            request = (HttpWebRequest)WebRequest.Create(url);
        }
    }
}

Согласно MSDN метод «Создать» может возвращать 4 исключения. Теперь я не могу растворить эти исключения ... потому что в противном случае класс не будет функционировать. Но что мне делать? Должен ли я все еще обернуть его в блок try / catch? и в подвохе "выбросить новое исключение" .. или пусть человек, который реализует этот класс, обрабатывает исключения?

Потому что это конструктор .. и я предполагаю, что конструкторы действительно должны потерпеть неудачу?

Ответы [ 3 ]

3 голосов
/ 10 января 2009

Если ваш конструктор может потерпеть неудачу, тогда вы, вероятно, должны позволить человеку, который реализует класс, обработать ошибки. Обязательно задокументируйте тот факт, что он может потерпеть неудачу, чтобы они знали, что нужно попробовать / поймать.

В связанной заметке конструкторы никогда не должны выходить из строя. =)

Вместо этого поместите логику, которая может потерпеть неудачу, в метод Go (). Таким образом, вы можете создать экземпляр реального класса, но поместите try / catch вокруг сегментов кода и все равно будете ссылаться на объект вне блока try-catch позже. Просто мои $ .02.

1 голос
/ 10 января 2009

Мне кажется, что этот код не тот код, который вы собираетесь использовать, поэтому я пытаюсь ответить на ваш вопрос, основываясь на том, что я могу решить, что вы пытаетесь задать.

Я бы порекомендовал, где это возможно, вы обрабатываете исключение. Если это невозможно, я думаю, что в вашем случае наилучшим подходом было бы обернуть исключение WebRequest.Create как InnerException и повторно выбросить его. Это сохраняет абстракцию, в то же время предоставляя больше деталей, если это необходимо. Вероятно, в соответствии с этим:

try{
    request = (HttpWebRequest)WebRequest.Create(url);
}
catch(Exception e) {
    throw new ForumLoginException(e);
}
1 голос
/ 10 января 2009

То, что вы делаете, зависит от роли кода. Если это библиотека, которой вы собираетесь поделиться, я бы порекомендовал вам обернуть все исключения и отбросить значимые исключения для вашей библиотеки. Это поможет вам достичь имплантации.

Например

try
{
   if (string.isNullOrEmpty(url))
   {
      //This will stop the arugment null exception and you can throw a meaningful message
   } 
    request = (HttpWebRequest)WebRequest.Create(url);
}
catch(SecurityException sex)
{
   //Can't handle this but maybee you can provide more information about how to configure security here...

     throw new YourCustomerException(msg,sex); //It's good practice to put the current exception in the inner exception
}

Если вы не создаете компонент, а это ваше приложение, я рекомендую вам где-нибудь в стеке отловить ошибку и записать ее в журнал.

Кроме того, это не конструктор, который вы вызываете в FactoryRequest методом Factory, который называется Create.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...