Определите исключение оператора присваивания строки, которое может произойти - PullRequest
0 голосов
/ 08 октября 2019

В настоящее время я изучаю правильное использование try, switch, исключения в c #, и я спрашиваю себя, можно ли генерировать исключения в операторе =.

Я немного погуглил и нашел https://referencesource.microsoft.com/#mscorlib/system/string.cs, это должна быть реализация для строкового класса, но я не смог найти определение оператора = в этом коде. Где я могу найти свою собственную реализацию класса string.cs в моей собственной системе? Я нашел только эту онлайн-версию.

string line = Console.ReadLine();
//Console.ReadLine() can throw ArgumentOutOfRangeException,
//OutOfMemoryException or IOException.
//but what can the = operator throw?

//what will happen in the following code?
string l = "Very Very extreme long long text";

Как справиться с этим на 100% правильно?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

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

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

Оператор присваивания не может быть перегружен.


Пример ошибки программирования:

int[] array = GetArray();
for (int i = 1; i <= array.Length; i++) {
    Console.WriteLine(array[i]);
}

Это будетбросить IndexOutOfBoundsException, потому что диапазон индекса изменяется от 0 до array.Length - 1.

Правильный код:

int[] array = GetArray();
for (int i = 0; i < array.Length; i++) { // Note: starting at 0 and using < instead of <=
    Console.WriteLine(array[i]);
}

Пример, где вы можете получить исключение справильный код -

File.WriteAllText(path, contents);

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

Здесь try-catch подходит.

1 голос
/ 08 октября 2019

Теоретически, вы не можете получить исключение из написанного вами кода.

Но, возможно, Console.ReadLine может вызвать исключение, если произойдет ошибка ввода-вывода или ядра.

Для строкового присваивания я не думаю, что может произойти что-то кроме нехватки памяти, переполнения памяти или повреждения процесса, и в этом случае вы потеряете весь контроль над приложением, которое рухнет, и, возможно, вы могли бы получитьBSOD или что-то в этом роде. В наше время это было бы очень, очень редко, на ПК, даже на смартфоне. Возможно, на встроенной мини-системе.

Вам не нужно пытаться ловить такие вещи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...