try / catch не работает над использованием оператора - PullRequest
0 голосов
/ 18 мая 2011
try
    {
        using (response = (HttpWebResponse)request.GetResponse())
            // Exception is not caught by outer try!
    }
    catch (Exception ex)
    {
        // Log
    }

EDIT:

// Code for binding IP address:
ServicePoint servicePoint = ServicePointManager.FindServicePoint(uri);
servicePoint.BindIPEndPointDelegate = new BindIPEndPoint(Bind);
//
private IPEndPoint Bind(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
    {
        IPAddress address;

        if (retryCount < 3)
            address = IPAddress.Parse("IPAddressHere");
        else
            {
                address = IPAddress.Any;
                throw new Exception("IP is not available,"); // This exception is not caught
            }

        return new IPEndPoint(address, 0);
    }

Ответы [ 4 ]

2 голосов
/ 18 мая 2011

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

class TestClass : IDisposable
{
    public void GetTest()
    {
        throw new Exception("Something bad happened"); // handle this
    }

    public void Dispose()
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (TestClass t = new TestClass())
            {
                Thread ts = new Thread(new ThreadStart(t.GetTest));
                ts.Start();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }
}
1 голос
/ 18 мая 2011

Ключевое слово using такое же, как try-catch-finally, http://msdn.microsoft.com/en-us/library/yh598w02.aspx. По сути, у вас есть try-catch-finally, вложенное в try-catch, поэтому вы, вероятно, так растерялись. 1003 *

Вы могли бы просто сделать это вместо ...

class Program
{
    static void Main(string[] args)
    {
        HttpWebResponse response = new HttpWebResponse();
        try
        {
            response.GetResponse();
        }
        catch (Exception ex)
        {
            //do something with the exception
        }
        finally
        {
            response.Dispose();
        }
    }
}
1 голос
/ 18 мая 2011

Это отлично работает.Вы увидите, как Console.WriteLine () * печатает исключение ()

class Program
{
    static void Main(string[] args)
    {
        Foo foo = new Foo();

        try
        {
            using (Bar bar = foo.CreateBar())
            {

            }
        }
        catch(Exception exception)
        {
            Console.WriteLine(exception.Message);
        }
    }
}

public class Foo
{
    public Bar CreateBar()
    {
        throw new ApplicationException("Something went wrong.");
    }
}

public class Bar : IDisposable
{
    public void Dispose()
    {
    }
}

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

class Program
{
    static void Main(string[] args)
    {
        Foo foo = new Foo();

        try
        {
            using (Bar bar = foo.CreateBar())
            {
                throw new ApplicationException("Something wrong inside the using.");
            }
        }
        catch(Exception exception)
        {
            Console.WriteLine(exception.Message);
        }
    }
}

public class Foo
{
    public Bar CreateBar()
    {
        return new Bar();
        // throw new ApplicationException("Something went wrong.");
    }
}

public class Bar : IDisposable
{
    public void Dispose()
    {
    }
}
1 голос
/ 18 мая 2011

У вас есть больше кода после использования?Для использования требуется один оператор или блок {} после оператора using.В приведенном ниже примере любое исключение внутри оператора using будет перехвачено блоком try..catch.

...