namespace Unosquare.RaspberryIO.Abstractions.Native
{
using System;
using System.Runtime.InteropServices;
///
/// Represents a low-level exception, typically thrown when return codes from a
/// low-level operation is non-zero or in some cases when it is less than zero.
///
///
public class HardwareException : Exception
{
///
/// Initializes a new instance of the class.
///
/// The error code.
/// The component.
public HardwareException(int errorCode, string component)
: base($"A hardware exception occurred. Error Code: {errorCode}")
{
ExtendedMessage = null;
try
{
ExtendedMessage = Standard.Strerror(errorCode);
}
catch
{
// Ignore
}
ErrorCode = errorCode;
Component = component;
}
///
/// Gets the error code.
///
///
/// The error code.
///
public int ErrorCode { get; }
///
/// Gets the component.
///
///
/// The component.
///
public string Component { get; }
///
/// Gets the extended message (could be null).
///
///
/// The extended message.
///
public string? ExtendedMessage { get; }
///
/// Throws a new instance of a hardware error by retrieving the last error number (errno).
///
/// Name of the class.
/// Name of the method.
/// When an error thrown by an API call occurs.
public static void Throw(string className, string methodName) => throw new HardwareException(Marshal.GetLastWin32Error(), $"{className}.{methodName}");
///
public override string ToString() => $"{nameof(HardwareException)}{(string.IsNullOrWhiteSpace(Component) ? string.Empty : $" on {Component}")}: ({ErrorCode}) - {Message}";
}
}