Member 12586110 Ответов: 1

Обработка ошибок C# в методе streamtobytearray


Привет, я работаю над добавлением блока try catch к приведенному ниже коду и хотел бы убедиться, что я делаю это правильно.

private IList<string> errmsgs = new List<string>();
string error = "";

public static byte[] streamToByteArray(Stream stream)
{
    using (MemoryStream ms = new MemoryStream())
    {
        stream.CopyTo(ms);
        return ms.ToArray();
    }
}


Что я уже пробовал:

Перепишите его в код ниже.

private IList<string> errmsgs = new List<string>();
string error = "";

public static byte[] streamToByteArray(Stream stream)
{
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            stream.CopyTo(ms);
            return ms.ToArray();
        }
    }
    catch (Exception e)
    {
        error = e.Message;
        errmsgs.Add(error);
        return (System.Text.Encoding.UTF8.GetBytes(error));
    }
}


Спасибо.

1 Ответов

Рейтинг:
11

Richard Deeming

Это зависит от того, что вы подразумеваете под словом "правильно".

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

Вы также обновляете static поле типа List<string>, что не является потокобезопасной операцией, без использования каких-либо координационных примитивов для ее защиты. Есть хороший шанс, что вы в конечном итоге испортите память, связанную с этим списком.

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


Member 12586110

Привет, Ричард Диминг, из того, что я понимаю, вы говорите, что держите код как есть без обработки ошибок. Это правда?

Спасибо.

Richard Deeming

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

Тем не менее, вы мог добавьте некоторую проверку аргументов:

public static byte[] streamToByteArray(Stream stream)
{
    if (stream == null) throw new ArgumentNullException(nameof(stream));
    if (!stream.CanRead) throw new NotSupportedException("Cannot copy from a write-only stream.");
    
    ...

Member 12586110

Привет, Ричард Диминг, может быть, что-то вроде ниже будет более уместным?

public static byte[] streamToByteArray(Stream stream)
        {
			if (stream == null) throw new ArgumentNullException(nameof(stream));
			if (!stream.CanRead) throw new NotSupportedException("Cannot copy from a write-only stream.");
			using (MemoryStream ms = new MemoryStream())
			{
				stream.CopyTo(ms);
				return ms.ToArray();
			}
        }


Спасибо Вам за помощь.

Richard Deeming

Да, именно так я бы его и реализовал.

Member 12586110

Большое спасибо.