Советы по рефакторингу вложенного блока try / catch внутри предложения using - PullRequest
1 голос
/ 13 марта 2020

Разработчик написал следующий код ниже, и я пытаюсь найти лучший способ его рефакторинга:

            try
            {
                using (var client = new WebClient())
                {
                    var proxy = new WebProxy(address, portNo);
                    proxy.BypassProxyOnLocal = false;
                    proxy.UseDefaultCredentials = true;
                    client.UseDefaultCredentials = true;

                    result = client.DownloadString(httpURL);
                }
            }
            catch (Exception ex)
            {
                log.Error("blah blah", ex);

                try
                {
                   SendNotification
                }
                catch (Exception emailEx)
                {
                    log.Error("blahblah " + emailEx);
                }
            }

Требуется ли условие using находиться внутри try / catch блок, учитывая, что он сам использует try / finally? И затем, если исключение выдается в using, как мне его обработать?

Есть ли лучший способ избежать вложенного try / catch при отправке уведомления?

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

Попробуйте вызвать SendNotification при возникновении исключения и обработать исключения в SendNotification():

try 
{
    using(var client = new WebClient())
    {
        var proxy = new WebProxy(address, portNo);
        proxy.BypassProxyOnLocal = false;
        proxy.UseDefaultCredentials = true;
        client.UseDefaultCredentials = true;    
        result = client.DownloadString(httpURL);
    }
}
catch (Exception ex)
{
    log.Error("blah blah", ex); 
    SendNotification(); 
}      

И SendNotification():

private void SendNotification()
{
    try 
    {
        // Here you are sending notifications
    }
    catch (Exception emailEx)
    {
        log.Error("blahblah " + emailEx);
    }    
}
1 голос
/ 13 марта 2020

Лучший способ избежать вложения - сделать это с помощью другой функции

catch (Exception ex)
        {
            log.Error("blah blah", ex);
            FUNCTION_NAME()
        }

private RETURN_TYPE  FUNCTION_NAME()
{
         try
        {
           SendNotification
        }
        catch (Exception emailEx)
        {
            log.Error("blahblah " + emailEx);
        }
 }
0 голосов
/ 13 марта 2020

Многие C# нативные библиотеки используют шаблон Try, чтобы указать, что они не будут выдавать:

Например: bool Dictionary.TryAdd (element)

public DoEverything()
{
    if(!TryDownload(..))
    {
        TrySendNotification();
    }
}

public bool TryDownload(out result)
{
    try {
        using(var client = new WebClient())
        {
            var proxy = new WebProxy(address, portNo);
            proxy.BypassProxyOnLocal = false;
            proxy.UseDefaultCredentials = true;
            client.UseDefaultCredentials = true;

            result = client.DownloadString(httpURL);
            return true;
        }
    }
    catch (Exception ex)
    {
        log.Error("blah blah", ex);  
        return false;
    }
}

public bool TrySendNotification()
{
    try 
    {
        // Here you are sending notifications
        return true;
    }
    catch (Exception emailEx)
    {
        log.Error("blahblah " + emailEx);
        return false;
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...