exception.h revision 302408
1234353Sdim/*- 2204642Srdivacky * Copyright (c) 2011, 2012, 2013 Spectra Logic Corporation 3204642Srdivacky * All rights reserved. 4204642Srdivacky * 5204642Srdivacky * Redistribution and use in source and binary forms, with or without 6204642Srdivacky * modification, are permitted provided that the following conditions 7204642Srdivacky * are met: 8204642Srdivacky * 1. Redistributions of source code must retain the above copyright 9204642Srdivacky * notice, this list of conditions, and the following disclaimer, 10204642Srdivacky * without modification. 11204642Srdivacky * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12204642Srdivacky * substantially similar to the "NO WARRANTY" disclaimer below 13204642Srdivacky * ("Disclaimer") and any redistribution must be conditioned upon 14204642Srdivacky * including a substantially similar Disclaimer requirement for further 15204642Srdivacky * binary redistribution. 16204642Srdivacky * 17218893Sdim * NO WARRANTY 18204642Srdivacky * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19249423Sdim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20204642Srdivacky * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21204642Srdivacky * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22204642Srdivacky * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23204642Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24204642Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25204642Srdivacky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26204642Srdivacky * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27234353Sdim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28204642Srdivacky * POSSIBILITY OF SUCH DAMAGES. 29218893Sdim * 30204642Srdivacky * Authors: Justin T. Gibbs (Spectra Logic Corporation) 31204642Srdivacky * 32204642Srdivacky * $FreeBSD: stable/11/lib/libdevdctl/exception.h 300906 2016-05-28 17:43:40Z asomers $ 33218893Sdim */ 34204642Srdivacky 35204642Srdivacky/** 36204642Srdivacky * \file zfsd_exception.h 37204642Srdivacky * 38204642Srdivacky * Definition of the ZfsdException class hierarchy. All exceptions 39204642Srdivacky * explicitly thrown by Zfsd are defined here. 40204642Srdivacky */ 41204642Srdivacky#ifndef _DEVDCTL_EXCEPTION_H_ 42204642Srdivacky#define _DEVDCTL_EXCEPTION_H_ 43204642Srdivacky 44204642Srdivacky/*============================ Namespace Control =============================*/ 45204642Srdivackynamespace DevdCtl 46204642Srdivacky{ 47218893Sdim 48218893Sdim/*============================= Class Definitions ============================*/ 49218893Sdim 50204642Srdivacky/*--------------------------------- Exception --------------------------------*/ 51204642Srdivacky/** 52204642Srdivacky * \brief Class allowing unified reporting/logging of exceptional events. 53204642Srdivacky */ 54218893Sdimclass Exception 55218893Sdim{ 56204642Srdivackypublic: 57204642Srdivacky /** 58204642Srdivacky * \brief Exception constructor allowing arbitrary string 59218893Sdim * data to be reported. 60218893Sdim * 61204642Srdivacky * \param fmt Printf-like string format specifier. 62218893Sdim */ 63204642Srdivacky Exception(const char *fmt, ...); 64204642Srdivacky 65204642Srdivacky /** 66218893Sdim * \brief Augment/Modify a Exception's string data. 67218893Sdim */ 68218893Sdim std::string& GetString(); 69218893Sdim 70218893Sdim /** 71204642Srdivacky * \brief Emit exception data to syslog(3). 72204642Srdivacky */ 73204642Srdivacky virtual void Log() const; 74204642Srdivacky 75204642Srdivackyprotected: 76204642Srdivacky Exception(); 77204642Srdivacky 78204642Srdivacky /** 79204642Srdivacky * \brief Convert exception string format and arguments provided 80204642Srdivacky * in event constructors into a linear string. 81207618Srdivacky */ 82207618Srdivacky void FormatLog(const char *fmt, va_list ap); 83207618Srdivacky 84218893Sdim std::string m_log; 85218893Sdim}; 86218893Sdim 87218893Sdiminline std::string & 88204642SrdivackyException::GetString() 89218893Sdim{ 90218893Sdim return (m_log); 91218893Sdim} 92218893Sdim 93204642Srdivacky/*------------------------------ ParseException ------------------------------*/ 94204642Srdivacky/** 95204642Srdivacky * Exception thrown when an event string is not converted to an actionable 96204642Srdivacky * Event object. 97204642Srdivacky */ 98204642Srdivackyclass ParseException : public Exception 99204642Srdivacky{ 100204642Srdivackypublic: 101204642Srdivacky enum Type 102204642Srdivacky { 103204642Srdivacky /** Improperly formatted event string encountered. */ 104204642Srdivacky INVALID_FORMAT, 105204642Srdivacky 106204642Srdivacky /** No handlers for this event type. */ 107204642Srdivacky DISCARDED_EVENT_TYPE, 108218893Sdim 109204642Srdivacky /** Unhandled event type. */ 110218893Sdim UNKNOWN_EVENT_TYPE 111218893Sdim }; 112218893Sdim 113218893Sdim /** 114218893Sdim * Constructor 115218893Sdim * 116218893Sdim * \param type The type of this exception. 117218893Sdim * \param parsedBuffer The parsing buffer active at the time of 118218893Sdim * the exception. 119218893Sdim * \param offset The location in the parse buffer where this 120218893Sdim * exception occurred. 121218893Sdim */ 122218893Sdim ParseException(Type type, const std::string &parsedBuffer, 123218893Sdim size_t offset = 0); 124218893Sdim 125218893Sdim /** 126218893Sdim * Accessor 127218893Sdim * 128218893Sdim * \return The classification for this exception. 129218893Sdim */ 130218893Sdim Type GetType() const; 131218893Sdim 132218893Sdim /** 133218893Sdim * Accessor 134218893Sdim * 135204642Srdivacky * \return The offset into the event string where this exception 136204642Srdivacky * occurred. 137204642Srdivacky */ 138204642Srdivacky size_t GetOffset() const; 139218893Sdim 140204642Srdivackyprivate: 141204642Srdivacky /** The type of this exception. */ 142204642Srdivacky Type m_type; 143204642Srdivacky 144204642Srdivacky /** The parsing buffer that was active at the time of the exception. */ 145204642Srdivacky const std::string m_parsedBuffer; 146204642Srdivacky 147218893Sdim /** 148218893Sdim * The offset into the event string buffer from where this 149204642Srdivacky * exception was triggered. 150218893Sdim */ 151204642Srdivacky size_t m_offset; 152218893Sdim}; 153218893Sdim 154218893Sdim//- ParseException Inline Const Public Methods --------------------------------- 155204642Srdivackyinline ParseException::Type 156204642SrdivackyParseException::GetType() const 157204642Srdivacky{ 158204642Srdivacky return (m_type); 159204642Srdivacky} 160204642Srdivacky 161204642Srdivackyinline size_t 162207618SrdivackyParseException::GetOffset() const 163207618Srdivacky{ 164207618Srdivacky return (m_offset); 165204642Srdivacky} 166204642Srdivacky 167204642Srdivacky} // namespace DevdCtl 168204642Srdivacky#endif /* _DEVDCTL_EXCEPTION_H_ */ 169204642Srdivacky