diff --git a/src/Core/ServiceWrapper/Main.cs b/src/Core/ServiceWrapper/Main.cs index 977bc31..e769d4d 100644 --- a/src/Core/ServiceWrapper/Main.cs +++ b/src/Core/ServiceWrapper/Main.cs @@ -513,11 +513,13 @@ namespace winsw } catch (WmiException e) { + Log.Fatal("WMI Operation failure: " + e.ErrorCode, e); Console.Error.WriteLine(e); return (int)e.ErrorCode; } catch (Exception e) { + Log.Fatal("Unhandled exception", e); Console.Error.WriteLine(e); return -1; } @@ -528,17 +530,29 @@ namespace winsw throw new WmiException(ReturnValue.NoSuchService); } + // ReSharper disable once InconsistentNaming + /// + /// Runs the wrapper. + /// + /// Arguments. If empty, WinSW will behave in the service mode. Otherwise - CLI mode + /// Service descriptor. If null, it will be initialized within the method. + /// In such case configs will be loaded from the XML Configuration File. + /// Any unhandled exception public static void Run(string[] _args, ServiceDescriptor descriptor = null) { bool isCLIMode = _args.Length > 0; + + + // If descriptor is not specified, initialize the new one (and load configs from there) var d = descriptor ?? new ServiceDescriptor(); - - // Configure the wrapper-internal logging - // STDIN and STDOUT of the child process will be handled independently + + // Configure the wrapper-internal logging. + // STDIN and STDOUT of the child process will be handled independently. InitLoggers(d, isCLIMode); - if (isCLIMode) // CLI mode + + if (isCLIMode) // CLI mode, in-service mode otherwise { Log.Debug("Starting ServiceWrapper in CLI mode"); diff --git a/src/Core/WinSWCore/Extensions/WinSWExtensionManager.cs b/src/Core/WinSWCore/Extensions/WinSWExtensionManager.cs index b51f3a0..2312c77 100644 --- a/src/Core/WinSWCore/Extensions/WinSWExtensionManager.cs +++ b/src/Core/WinSWCore/Extensions/WinSWExtensionManager.cs @@ -86,6 +86,11 @@ namespace winsw.Extensions //TODO: Implement loading of external extensions. Current version supports internal hack #region Extension load management + /// + /// Loads extensions according to the configuration file. + /// + /// Logger + /// Loading failure public void LoadExtensions(IEventWriter logger) { var extensionIds = ServiceDescriptor.ExtensionIds; @@ -100,7 +105,7 @@ namespace winsw.Extensions /// /// Extension ID /// Logger - /// Loading failure + /// Loading failure private void LoadExtension(string id, IEventWriter logger) { if (Extensions.ContainsKey(id)) @@ -120,8 +125,15 @@ namespace winsw.Extensions { IWinSWExtension extension = CreateExtensionInstance(descriptor.Id, descriptor.ClassName); extension.Descriptor = descriptor; - //TODO: Handle exceptions - extension.Configure(ServiceDescriptor, configNode, logger); + try + { + extension.Configure(ServiceDescriptor, configNode, logger); + } + catch (Exception ex) + { // Consider any unexpected exception as fatal + Log.Fatal("Failed to configure the extension " + id, ex); + throw ex; + } Extensions.Add(id, extension); logger.LogEvent("Extension loaded: "+id, EventLogEntryType.Information); }