Допустима ли пустая попытка и перехват IndexOutOfBoundsException в конце цикла while операторов if в C#? ⇐ C#
Допустима ли пустая попытка и перехват IndexOutOfBoundsException в конце цикла while операторов if в C#?
Я заканчиваю незавершенный проект C# WinForms, который представляет собой редактор сохранений для неуказанной игры. Я заметил, что идентификаторы портретов персонажей и значков имеют допустимый диапазон от 1 до 905, но не было кода для проверки того, что идентификатор персонажа находится в этом диапазоне, поэтому я решил это исправить. У меня есть решение этой проблемы, код которого (с частично отредактированными именами многих функций) приведен в конце этого поста, и я хотел знать, будет ли оно работать. Visual Studio говорит, что ошибок форматирования нет, но я знаю, что одного этого будет недостаточно. Я не могу скомпилировать для тестирования, потому что я еще не на той стадии, когда код можно компилировать, и у меня много недостающих данных WinForms. Если конкретное исключение, которое я разместил, не подходит, какое исключение подойдет лучше всего? Если цикл while не следует использовать таким образом, какой метод мне следует использовать, чтобы не переписывать весь блок кода с нуля? Вот соответствующий код, который у меня есть:
void getImage(int slot) { короткий идентификатор = 0; если (слот == 1) { пытаться { ID = ConvertStringtoID(comboBoxSlot1ID.Text); } улов (System.FormatException) { идентификатор = 0; } в то время как (ID > 0 && ID < 906) { если (ID < 10) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("00" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon00" + ID); } иначе, если (ID > 9 && ID < 100) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("0" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon0" + ID); } иначе, если (ID > 99 && ID < 906) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("значок" + ID); } еще { пытаться { } улов (System.IndexOutOfRangeException) { идентификатор = 0; } } } } } Мне еще не удалось ничего попробовать или протестировать; это просто вопрос относительно допустимого использования кода C#. Я также видел только один вопрос, который был похож, но не совпадал с моим вопросом в разделе «возможно связанные вопросы», прежде чем публиковать это, хотя это частично указывало на то, что то, что я делаю, может быть правильным. Я ожидаю, что код выдаст IndexOutOfBoundsException, если ID больше 905, и прочитает правильный файл изображения, если нет.
Изменить: Хорошо, я значительно переработал код, используя отзывы, опубликованные здесь. В итоге я получил следующий код, который не показывает ошибок в Visual Studio, и, несмотря на то, что другие говорят, что «неправильно использовать исключения для управления потоком», он работает для моего варианта использования. Кроме того, технически я не использую их для управления чем-либо, просто я хочу, чтобы окно исключения появлялось для всех, у кого есть файл сохранения с идентификатором персонажа больше 905, чтобы они знали, что их файл сохранения, вероятно, поврежден. Я хочу, чтобы программа могла продолжить работу и после этого, и чтобы эта ошибка не стала фатальной. Вот исправленный код:
void getImage(int slot) { короткий идентификатор = 0; если (слот == 1) { пытаться { ID = ConvertStringtoID(comboBoxSlot1ID.Text); } улов (System.FormatException) { идентификатор = 0; } если (ID < 10) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("00" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon00" + ID); } иначе, если (ID > 9 && ID < 100) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("0" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon0" + ID); } иначе, если (ID > 99 && ID < 906) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("значок" + ID); } иначе, если (ID > 905) { throw(System.InvalidOperationException); идентификатор = 0; продолжать; } } }
Я заканчиваю незавершенный проект C# WinForms, который представляет собой редактор сохранений для неуказанной игры. Я заметил, что идентификаторы портретов персонажей и значков имеют допустимый диапазон от 1 до 905, но не было кода для проверки того, что идентификатор персонажа находится в этом диапазоне, поэтому я решил это исправить. У меня есть решение этой проблемы, код которого (с частично отредактированными именами многих функций) приведен в конце этого поста, и я хотел знать, будет ли оно работать. Visual Studio говорит, что ошибок форматирования нет, но я знаю, что одного этого будет недостаточно. Я не могу скомпилировать для тестирования, потому что я еще не на той стадии, когда код можно компилировать, и у меня много недостающих данных WinForms. Если конкретное исключение, которое я разместил, не подходит, какое исключение подойдет лучше всего? Если цикл while не следует использовать таким образом, какой метод мне следует использовать, чтобы не переписывать весь блок кода с нуля? Вот соответствующий код, который у меня есть:
void getImage(int slot) { короткий идентификатор = 0; если (слот == 1) { пытаться { ID = ConvertStringtoID(comboBoxSlot1ID.Text); } улов (System.FormatException) { идентификатор = 0; } в то время как (ID > 0 && ID < 906) { если (ID < 10) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("00" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon00" + ID); } иначе, если (ID > 9 && ID < 100) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("0" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon0" + ID); } иначе, если (ID > 99 && ID < 906) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("значок" + ID); } еще { пытаться { } улов (System.IndexOutOfRangeException) { идентификатор = 0; } } } } } Мне еще не удалось ничего попробовать или протестировать; это просто вопрос относительно допустимого использования кода C#. Я также видел только один вопрос, который был похож, но не совпадал с моим вопросом в разделе «возможно связанные вопросы», прежде чем публиковать это, хотя это частично указывало на то, что то, что я делаю, может быть правильным. Я ожидаю, что код выдаст IndexOutOfBoundsException, если ID больше 905, и прочитает правильный файл изображения, если нет.
Изменить: Хорошо, я значительно переработал код, используя отзывы, опубликованные здесь. В итоге я получил следующий код, который не показывает ошибок в Visual Studio, и, несмотря на то, что другие говорят, что «неправильно использовать исключения для управления потоком», он работает для моего варианта использования. Кроме того, технически я не использую их для управления чем-либо, просто я хочу, чтобы окно исключения появлялось для всех, у кого есть файл сохранения с идентификатором персонажа больше 905, чтобы они знали, что их файл сохранения, вероятно, поврежден. Я хочу, чтобы программа могла продолжить работу и после этого, и чтобы эта ошибка не стала фатальной. Вот исправленный код:
void getImage(int slot) { короткий идентификатор = 0; если (слот == 1) { пытаться { ID = ConvertStringtoID(comboBoxSlot1ID.Text); } улов (System.FormatException) { идентификатор = 0; } если (ID < 10) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("00" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon00" + ID); } иначе, если (ID > 9 && ID < 100) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("0" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("icon0" + ID); } иначе, если (ID > 99 && ID < 906) { PictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("" + ID); PictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("значок" + ID); } иначе, если (ID > 905) { throw(System.InvalidOperationException); идентификатор = 0; продолжать; } } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение