public static bool DownloadImage(string url, out Image image)
{
using (WebClient wc = new WebClient())
{
using (Stream stream = wc.OpenRead(url))
{
image = Image.FromStream(stream);
return true;
}
}
}
Если я правильно понял, то для объектов в using автоматически будет вызван метод Dispose(), даже если произойдёт экскепшен.
А почему выполнение дальше usingа не идёт?
public static bool DownloadImage(string url, out Image image)
{
using (WebClient wc = new WebClient())
{
using (Stream stream = wc.OpenRead(url))
{
image = Image.FromStream(stream);
return true;
}
return false; // недостижимый код
}
return false; // недостижимый код
}
The using statement ensures that Dispose (or DisposeAsync) is called even if an exception occurs within the using block. You can achieve the same result by putting the object inside a try block and then calling Dispose (or DisposeAsync) in a finally block; in fact, this is how the using statement is translated by the compiler.
то мне всё-равно не понятно, почему выполнение не идёт дальше.
Не поверите, но никогда в жизни finally не использовал.
То есть, если нет catch или except, то вся программа сразу накрывается?
И если в using будет экскепшен - тоже всё вылетит?
В finally код, который выполнится не зависимо от способа выхода из блока try. Совсем же ведь не обязательно выход из try после последней команды блока. Как следствие - прога более читабельна
Если после этого программа накроется, то какая уже будет разница утекла память или нет? Особенно если программа делала что-то важное по таймеру. Кто тогда должен следить, накрылась она или нет? Разве catch не для этого в принципе был создан, чтобы продолжать работу после экскепшена? Для чего тогда?
Почему нельзя контролировать утечку в except / catch?
А какие бывают способы?
И?
Более читабельна из-за невозможности продолжить работу после экскепшена? Что?
using System;
using System.IO;
public class Program
{
public static byte[] ReadData(string filePath)
{
using (var fs = new FileStream(filePath, FileMode.Open))
{
var result = new byte[84];
fs.Read(result, 42, 84);
return result;
}
}
public static void AnalyzeData(byte[] data)
{
}
public static void DoStuff()
{
try
{
AnalyzeData(ReadData("file.bin"));
}
catch (IOException)
{
AnalyzeData(ReadData("file2.bin"));
}
}
public static void Main()
{
try
{
DoStuff();
}
catch (Exception ex)
{
Console.WriteLine("A critical error occurred, please check the data or contact the support.");
}
}
}
Получается обёртка для обёртки из обёртки обёртки в обёртке.
Если нужно сделать несколько try в одном методе и выдать разный результат, то это не прокатит.
ну вот вы обернули какой-то метод в catch. А в этом методе есть несколько try catch, которые возвращают разный результат из catch.
Что тогда получится? По-идее, должен сработать тот catch, которым обёрнут метод. Нет?