static void AppDomainUnhandledException_Handler(object sender, UnhandledExceptionEventArgs e) { bool lockCapture = Monitor.TryEnter(HConsole.SyncRoot, 500); try { HConsole.Print(); HConsole.PrintIntensive("=== {0}: ===", HProgram.IsInMainThread ? "Необработанное исключение в основном программном потоке" : "Необработанное исключение по второстепенном программном потоке"); var exception = e.ExceptionObject as Exception; using (new HConsoleColorRetention(HConsole.ErrorColor)) if (exception != null) { // Вывод цепи исключений (без стека вызовов): Console.WriteLine(HException.ComposeChainedMessage(exception)); } else { Console.WriteLine( "Объект необработанного исключения не является экземпляром " + "\"System.Exception\"."); } } finally { if (lockCapture) { Monitor.Exit(HConsole.SyncRoot); } } // Стек вызовов будет выведен на консоль автоматически (серым цветом). }
static void PrintSyntax() { HConsole.PrintIntensive( "=== Синтаксис: ==="); HConsole.PrintExpressive( "{0} \"<сервер>\" \"<БД>\" \"<команда>\" \"[параметр команды]\"", AssemblyName); HConsole.PrintIntensive( "=== Список команд (не чувствительно к регистру): ==="); HConsole.PrintExpressive( "{0} {1} создание структуры БД (\"Database.EnsureCreated\")", UtilityCommand.CreateStructure, HConsole.LongDash); HConsole.PrintExpressive( "{0} {1} уничтожение структуры БД; параметр: [NotInTransaction]", UtilityCommand.DestroyStructure, HConsole.LongDash); HConsole.PrintExpressive( "{0} {1} уничтожение+создание структуры БД", UtilityCommand.RecreateStructure, HConsole.LongDash); HConsole.PrintExpressive( "{0} {1} зачистка содержимого таблиц; параметр: [NotInTransaction]", UtilityCommand.DeleteData, HConsole.LongDash); HConsole.PrintExpressive( "{0} {1} наполнение тестовыми данными; параметр: [WithCleanup]", UtilityCommand.FillTest, HConsole.LongDash); string sampleSvr = "(localdb)\\MSSQLLocalDB", sampleDB = "TEST"; HConsole.PrintIntensive( "=== Примеры команд: ==="); HConsole.Print( "DBCorrector \"{1}\" \"{2}\" {0}", UtilityCommand.CreateStructure, sampleSvr, sampleDB); HConsole.Print( "DBCorrector \"{1}\" \"{2}\" {0}", UtilityCommand.DestroyStructure, sampleSvr, sampleDB); HConsole.Print( "DBCorrector \"{1}\" \"{2}\" {0}", UtilityCommand.RecreateStructure, sampleSvr, sampleDB); HConsole.Print( "DBCorrector \"{1}\" \"{2}\" {0} NotInTransaction", UtilityCommand.DeleteData, sampleSvr, sampleDB); HConsole.Print( "DBCorrector \"{1}\" \"{2}\" {0} WithCleanup", UtilityCommand.FillTest, sampleSvr, sampleDB); }
/// <summary> /// Основной блок программы (вызывается из "Program.Main") /// </summary> /// <exception cref="HAppFailureException" /> static void Run() { DBC.ConnectionStringAccessor = () => $"Server={ServerName};Database={DatabaseName};Trusted_Connection=True;" + $"Application Name={AssemblyName} (Console App);;Pooling=False"; HConsole.PrintIntensive($"=== Команда \"{Command}\": ==="); HConsole.Print($"База данных: [{ServerName}].[{DatabaseName}]"); try { switch (Command) { case UtilityCommand.CreateStructure: CreateStructure_Command(); break; case UtilityCommand.DestroyStructure: DestroyStructure_Command(); break; case UtilityCommand.RecreateStructure: RecreateStructure_Command(); break; case UtilityCommand.DeleteData: DeleteData_Command(); break; case UtilityCommand.FillTest: FillTest_Command(); break; default: throw new HDeadCodeBranchException(); } } catch (Exception e) { if (e is HDeadCodeBranchException) { throw; } if (e is OperationFailedException || e is HAppFailureException) { throw new HAppFailureException(e.Message); } } HConsole.PrintExpressive("Выполнено."); }