Подтвердить что ты не робот

Как сообщить о стандартных исключениях пользователю?

Рассмотрим приложение С# GUI, которое использует FileStream для чтения файла, выбранного пользователем через диалог "Открыть файл".

Если сбой чтения с одним из исключений, то какой правильный способ сообщить об ошибке пользователю, дружелюбие?

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

Изменить

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

4b9b3361

Ответ 1

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

Мое предложение было бы:

  • У вас есть один уровень пользователя FileUploadErrorException
  • У вас есть свойство details
  • В зависимости от фактического исключения предложите пользователю попробовать несколько вещей.

Ответ 2

Если вы обнаруживаете исключение, созданное одним из классов .Net framework File, то вполне вероятно, что содержимое свойства exception .Message уже будет локализовано. Свойство .Message должно содержать локализованный, удобочитаемый текст. Как "дружелюбно" это зависит, я думаю, но это может содержать что-то, что вы можете встроить в более общий и дружественный абзац.

Предполагая, что вы можете написать какой-либо метод AlertUserWithMessage() для отображения ошибки пользователю, это может быть полезно:

try
{
    fileStream.Read(...);  // or some other operation
}
catch(Exception e)
{
    AlertUserWithMessage(e.Message);
}

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

try
{
    fileStream.Read(...);  // or some other operation
}
catch(Exception e)
{
    AlertUserWithMessageAndStackTrace(e.Message, e.StackTrace);
}

Ответ 3

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

Таким образом, для достойного пользовательского опыта гораздо лучше сопоставить эти исключения с локализованными удобными советами о том, как обойти эту проблему. Конечно, для технических пользователей было бы неплохо иметь некоторую диагностическую функцию, которая могла бы дать подробности об исключении (в этом случае наличие сообщений об исключениях на английском языке не имеет значения - английский действительно является мировым техническим языком) или просто указывает их в журнал со всеми деталями. Но просто бросать сообщение об исключении, даже локализованное, у конечного пользователя, вероятно, будет препятствовать им.

По этой причине я не думаю, что локализация сообщений об исключениях очень полезна. Это правда, что .NET Framework имеет локализованные сообщения об исключениях для основных языков, но я думаю, что это связано с тем, что есть разработчики, которые используют эти языки в качестве базового языка и не обязательно хорошо владеют английским языком. Таким образом, публикация этих локализованных сообщений исключений по-прежнему является разработчиками, а не конечными пользователями программного продукта, встроенного в .NET.