diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs index 4d63f1a..0fc31a8 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/AbstractCompany.cs @@ -98,8 +98,12 @@ public abstract class AbstractCompany SetObjectsPosition(); for (int i = 0; i < (_collection?.Count ?? 0); ++i) { - DrawningBaseStormtrooper? obj = _collection?.Get(i); - obj?.DrawTransport(graphics); + try + { + DrawningBaseStormtrooper? obj = _collection?.Get(i); + obj?.DrawTransport(graphics); + } + catch (Exception) { } } return bitmap; } diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs index 43a9bbb..4a0c4d3 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/ListGenericObjects.cs @@ -1,4 +1,6 @@ -namespace ProjectStormtrooper.CollectionGenericObjects; +using ProjectStormtrooper.Exceptions; + +namespace ProjectStormtrooper.CollectionGenericObjects; /// /// Параметризованный набор объектов @@ -41,47 +43,34 @@ where T : class } public T? Get(int position) { - // TODO проверка позиции - if( position>= 0 && position < Count) - { - return _collection[position]; - } - return null; + //TODO выброс ошибки если выход за границу + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + return _collection[position]; } public int Insert(T obj) { - // TODO проверка, что не превышено максимальное количество элементов - // TODO вставка в конец набора - if (Count <= _maxCount) - { - _collection.Add(obj); - return Count; - } - return -1; + // TODO выброс ошибки если переполнение + if (Count == _maxCount) throw new CollectionOverflowException(Count); + _collection.Add(obj); + return Count; } public int Insert(T obj, int position) { - // TODO проверка, что не превышено максимальное количество элементов - // TODO проверка позиции - // TODO вставка по позиции - if (Count < _maxCount && position>=0 && position < _maxCount) - { - _collection.Insert(position, obj); - return position; - } - return -1; + // TODO выброс ошибки если переполнение + // TODO выброс ошибки если за границу + if (Count == _maxCount) throw new CollectionOverflowException(Count); + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + _collection.Insert(position, obj); + return position; + } public T Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из списка - T temp = _collection[position]; - if(position>=0 && position < _maxCount) - { - _collection.RemoveAt(position); - return temp; - } - return null; + // TODO если выброс за границу + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + T obj = _collection[position]; + _collection.RemoveAt(position); + return obj; } public IEnumerable GetItems() diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs index 50248c9..a5a2093 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,4 +1,5 @@ using ProjectStormtrooper.Drawnings; +using ProjectStormtrooper.Exceptions; namespace ProjectStormtrooper.CollectionGenericObjects; @@ -49,14 +50,16 @@ public class MassiveGenericObjects : ICollectionGenericObjects public T Get(int position) { - // TODO проверка позиции - if (position >= _collection.Length || position < 0) return null; + // TODO выброс ошибки если выход за границу + // TODO выброс ошибки если объект пустой + if (position >= _collection.Length || position < 0) throw new PositionOutOfCollectionException(position); + if (_collection[position] == null) throw new ObjectNotFoundException(position); return _collection[position]; } public int Insert(T obj) { - // TODO вставка в свободное место набора + // TODO выброс ошибки если переполнение int index = 0; while (index < _collection.Length) { @@ -67,17 +70,14 @@ public class MassiveGenericObjects : ICollectionGenericObjects } index++; } - return -1; + throw new CollectionOverflowException(Count); } public int Insert(T obj, int position) { - // TODO проверка позиции - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то - // ищется свободное место после этой позиции и идет вставка туда - // если нет после, ищем до - // TODO вставка - if (position >= _collection.Length || position < 0) return -1; + // TODO выброс ошибки если переполнение + // TODO выброс ошибки если выход за границу + if (position >= _collection.Length || position < 0) throw new PositionOutOfCollectionException(position); if (_collection[position] == null) { _collection[position] = obj; @@ -103,14 +103,15 @@ public class MassiveGenericObjects : ICollectionGenericObjects } index--; } - return -1; + throw new CollectionOverflowException(Count); } public T? Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из массива, присвоив элементу массива значение null - if (position >= _collection.Length || position < 0) return null; + // TODO выброс ошибки если выход за границу + // TODO выброс ошибки если объект пустой + if (position >= _collection.Length || position < 0) throw new PositionOutOfCollectionException(position); + if (_collection[position] == null) throw new ObjectNotFoundException(position); T temp = _collection[position]; _collection[position] = null; return temp; diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs index 9cc8089..55003ca 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StorageCollection.cs @@ -1,4 +1,5 @@ using ProjectStormtrooper.Drawnings; +using ProjectStormtrooper.Exceptions; using System.Text; namespace ProjectStormtrooper.CollectionGenericObjects; @@ -90,11 +91,11 @@ where T : DrawningBaseStormtrooper /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (_storages.Count == 0) { - return false; + throw new Exception("В хранилище отсутствуют коллекции для сохранения"); } if (File.Exists(filename)) { @@ -127,7 +128,6 @@ where T : DrawningBaseStormtrooper writer.Write(_separatorItems); } } - return true; } } /// @@ -135,22 +135,22 @@ where T : DrawningBaseStormtrooper /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new Exception("Файл не существует"); } using (StreamReader fs = File.OpenText(filename)) { string str = fs.ReadLine(); if (str == null || str.Length == 0) { - return false; + throw new Exception("В файле нет данных"); } if (!str.StartsWith(_collectionKey)) { - return false; + throw new Exception("В файле неверные данные"); } _storages.Clear(); string strs = ""; @@ -165,7 +165,7 @@ where T : DrawningBaseStormtrooper ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { - return false; + throw new Exception("Не удалось создать коллекцию"); } collection.MaxCount = Convert.ToInt32(record[2]); string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); @@ -173,15 +173,21 @@ where T : DrawningBaseStormtrooper { if (elem?.CreateDrawningStormtrooper() is T stormtrooper) { - if (collection.Insert(stormtrooper) == -1) + try { - return false; + if (collection.Insert(stormtrooper) == -1) + { + throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]); + } + } + catch (CollectionOverflowException ex) + { + throw new Exception("Коллекция переполнена", ex); } } } _storages.Add(record[0], collection); } - return true; } } /// diff --git a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs index e8143f5..3187ee6 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/CollectionGenericObjects/StormtrooperSharingService.cs @@ -37,11 +37,12 @@ public class StormtrooperSharingService : AbstractCompany int curHeight = 0; for (int i = 0; i < (_collection?.Count ?? 0); i++) { - if (_collection.Get(i) != null) + try { _collection.Get(i).SetPictureSize(_pictureWidth, _pictureHeight); _collection.Get(i).SetPosition(_placeSizeWidth * curWidth + 15, curHeight * _placeSizeHeight + 3); } + catch (Exception) { } if (curWidth >0) curWidth--; else diff --git a/ProjectStormtrooper/ProjectStormtrooper/Exceptions/CollectionOverflowException.cs b/ProjectStormtrooper/ProjectStormtrooper/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..f4e5fa9 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace ProjectStormtrooper.Exceptions; + +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +internal class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + protected CollectionOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectStormtrooper/ProjectStormtrooper/Exceptions/ObjectNotFoundException.cs b/ProjectStormtrooper/ProjectStormtrooper/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..b6bc47b --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace ProjectStormtrooper.Exceptions; + +/// +/// Класс, описывающий ошибку, что по указанной позиции нет элемента +/// +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/Exceptions/PositionOutOfCollectionException.cs b/ProjectStormtrooper/ProjectStormtrooper/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..8da062f --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace ProjectStormtrooper.Exceptions; + +/// +/// Класс, описывающий ошибку выхода за границы коллекции +/// +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции.Позиция " + i) { } + public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs index 65ca676..4018f1b 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/FormStormtrooperCollection.cs @@ -1,5 +1,7 @@ -using ProjectStormtrooper.CollectionGenericObjects; +using Microsoft.Extensions.Logging; +using ProjectStormtrooper.CollectionGenericObjects; using ProjectStormtrooper.Drawnings; +using ProjectStormtrooper.Exceptions; namespace ProjectStormtrooper; /// @@ -16,13 +18,16 @@ public partial class FormStormtrooperCollection : Form /// Компания /// private AbstractCompany? _company; + private readonly ILogger _logger; /// /// Конструктор /// - public FormStormtrooperCollection() + public FormStormtrooperCollection(ILogger logger) { InitializeComponent(); _storageCollection = new(); + _logger = logger; + _logger.LogInformation("Форма загрузилась"); } /// /// Выбор компании @@ -39,21 +44,29 @@ public partial class FormStormtrooperCollection : Form /// private void SetStormtrooper(DrawningBaseStormtrooper stormtrooper) { - if (_company == null || stormtrooper == null) + try { - return; + if (_company == null || stormtrooper == null) + { + return; + } + if (_company + stormtrooper != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: " + stormtrooper.GetDataForSave()); + } + } - if (_company + stormtrooper != -1) - { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); - } - else + catch (ObjectNotFoundException) { } + catch (CollectionOverflowException ex) { MessageBox.Show("Не удалось добавить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); } - } + + /// /// Добавление бомбардировщика /// @@ -85,15 +98,21 @@ public partial class FormStormtrooperCollection : Form int pos = Convert.ToInt32(maskedTextBoxPosition.Text); int tempSize = StormtrooperSharingService.getAmountOfObjects(); - if (_company - pos != null) + try { - MessageBox.Show("Объект удалён"); - pictureBox.Image = _company.Show(); + if (_company - pos != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Удален объект по позиции " + pos); + } } - else + catch(Exception ex) { MessageBox.Show("Не удалось удалить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); } + } /// @@ -109,25 +128,28 @@ public partial class FormStormtrooperCollection : Form } DrawningBaseStormtrooper? stormtrooper = null; int counter = 100; - while (stormtrooper == null) + try { - stormtrooper = _company.GetRandomObject(); - counter--; - if (counter < -0) - { - break; - } - } - if (stormtrooper == null) - { - return; - } - FormStormtrooper form = new() - { - SetStormtrooper = stormtrooper - }; - form.ShowDialog(); + while (stormtrooper == null) + { + stormtrooper = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + FormStormtrooper form = new(); + { + SetStormtrooper(stormtrooper); + }; + form.ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } /// /// Перерисовка коллекции @@ -157,18 +179,25 @@ public partial class FormStormtrooperCollection : Form MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - CollectionType collectionType = CollectionType.None; - if (radioButtonMassive.Checked) + try { - collectionType = CollectionType.Massive; + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + RerfreshListBoxItems(); + _logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text); } - else if (radioButtonList.Checked) + catch(Exception ex) { - collectionType = CollectionType.List; + _logger.LogError("Ошибка: {Message}", ex.Message); } - _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); - RerfreshListBoxItems(); - } /// @@ -187,12 +216,20 @@ public partial class FormStormtrooperCollection : Form MessageBox.Show("Коллекция не выбрана"); return; } - if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + try { - return; + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + RerfreshListBoxItems(); + _logger.LogInformation("Коллекция: " + listBoxCollection.SelectedItem.ToString() + " удалена"); + } + catch (Exception ex) + { + _logger.LogError("Ошибка: {Message}", ex.Message); } - _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); - RerfreshListBoxItems(); } /// @@ -247,15 +284,17 @@ public partial class FormStormtrooperCollection : Form { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + try { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } @@ -269,16 +308,19 @@ public partial class FormStormtrooperCollection : Form //TODO продумать логику if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.LoadData(openFileDialog.FileName)) + try { + _storageCollection.LoadData(openFileDialog.FileName); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); RerfreshListBoxItems(); + _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); } - else + catch(Exception ex) { MessageBox.Show("Загрузка не удалась", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } diff --git a/ProjectStormtrooper/ProjectStormtrooper/Program.cs b/ProjectStormtrooper/ProjectStormtrooper/Program.cs index 41063d3..1a3dcfc 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/Program.cs +++ b/ProjectStormtrooper/ProjectStormtrooper/Program.cs @@ -1,3 +1,8 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; +using Microsoft.Extensions.Configuration; + namespace ProjectStormtrooper { internal static class Program @@ -11,7 +16,30 @@ namespace ProjectStormtrooper // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormStormtrooperCollection()); + ServiceCollection services = new(); + ConfigureServices(services); + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + Application.Run(serviceProvider.GetRequiredService()); + } + private static void ConfigureServices(ServiceCollection services) + { + + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + services.AddSingleton() + .AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .AddJsonFile($"{pathNeed}serilog.json") + .Build()) + .CreateLogger()); + }); } } } \ No newline at end of file diff --git a/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj b/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj index 244387d..53e3dd5 100644 --- a/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj +++ b/ProjectStormtrooper/ProjectStormtrooper/ProjectStormtrooper.csproj @@ -8,6 +8,17 @@ enable + + + + + + + + + + + True diff --git a/ProjectStormtrooper/ProjectStormtrooper/serilog.json b/ProjectStormtrooper/ProjectStormtrooper/serilog.json new file mode 100644 index 0000000..21a6582 --- /dev/null +++ b/ProjectStormtrooper/ProjectStormtrooper/serilog.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { "path": "log.log" } + } + ], + "Properties": { + "Application": "Sample" + } + } +} \ No newline at end of file