- 異常的類型能夠是自定義類類型
- 對於類類型異常的匹配依舊是至上而下嚴格匹配
- 賦值兼容性原則在異常匹配中依然適用
通常而言編程
- 匹配子類異常的 catch 放在上部
- 匹配父類異常的 catch 放下下部
現代C++庫必然包含充要的異常類
異常類是數據結構類所依賴的」基礎設施「!數據結構
異常類 | 功能定義 |
ArithmeticException | 計算異常 |
NullPointerException | 空指針異常 |
IndexOutOfBoundsException | 越界異常 |
NoEnoughMemoryException | 內存不足異常 |
InvalidParameterExcetion | 參數錯誤異常 |
class Exception { public: Exception(const char *message); Exception(const char *file, int line); Exception(const char *message, const char *file, int line); Exception(const Exception &e); Exception &operator= (const Exception &e); virtual const char *message() const; virtual const char *location() const; virtual ~Exception(); };
文件:Exception.h架構
#ifndef EXCEPTION_H #define EXCEPTION_H namespace DTLib { #define THROW_EXCEPTION(e, m) (throw e(m, __FILE__, __LINE__)) class Exception { public: Exception(const char *message); Exception(const char *file, int line); Exception(const char *message, const char *file, int line); Exception(const Exception &e); Exception &operator= (const Exception &e); virtual const char *message() const; virtual const char *location() const; virtual ~Exception(); protected: char *m_message = nullptr; char *m_location = nullptr; }; class ArithmeticExcption : public Exception { public: ArithmeticExcption() : Exception(nullptr) { } ArithmeticExcption(const char *message) : Exception(message) { } ArithmeticExcption(const char *file, int line) : Exception(file, line) { } ArithmeticExcption(const char *message, const char *file, int line) : Exception(message, file, line) { } ArithmeticExcption(const ArithmeticExcption &e) : Exception(e) { } ArithmeticExcption &operator= (const ArithmeticExcption &e) { Exception::operator=(e); return *this; } ~ArithmeticExcption() override { } }; class NullPointerException : public Exception { public: NullPointerException() : Exception(nullptr) { } NullPointerException(const char *message) : Exception(message) { } NullPointerException(const char *file, int line) : Exception(file, line) { } NullPointerException(const char *message, const char *file, int line) : Exception(message, file, line) { } NullPointerException(const ArithmeticExcption &e) : Exception(e) { } NullPointerException &operator= (const ArithmeticExcption &e) { Exception::operator=(e); return *this; } ~NullPointerException() override { } }; class IndexOutOfBoundsException : public Exception { public: IndexOutOfBoundsException() : Exception(nullptr) { } IndexOutOfBoundsException(const char *message) : Exception(message) { } IndexOutOfBoundsException(const char *file, int line) : Exception(file, line) { } IndexOutOfBoundsException(const char *message, const char *file, int line) : Exception(message, file, line) { } IndexOutOfBoundsException(const ArithmeticExcption &e) : Exception(e) { } IndexOutOfBoundsException &operator= (const ArithmeticExcption &e) { Exception::operator=(e); return *this; } ~IndexOutOfBoundsException() override { } }; class NoEnoughMemoryException : public Exception { public: NoEnoughMemoryException() : Exception(nullptr) { } NoEnoughMemoryException(const char *message) : Exception(message) { } NoEnoughMemoryException(const char *file, int line) : Exception(file, line) { } NoEnoughMemoryException(const char *message, const char *file, int line) : Exception(message, file, line) { } NoEnoughMemoryException(const ArithmeticExcption &e) : Exception(e) { } NoEnoughMemoryException &operator= (const ArithmeticExcption &e) { Exception::operator=(e); return *this; } ~NoEnoughMemoryException() override { } }; class InvalidParameterExcetion : public Exception { public: InvalidParameterExcetion() : Exception(nullptr) { } InvalidParameterExcetion(const char *message) : Exception(message) { } InvalidParameterExcetion(const char *file, int line) : Exception(file, line) { } InvalidParameterExcetion(const char *message, const char *file, int line) : Exception(message, file, line) { } InvalidParameterExcetion(const ArithmeticExcption &e) : Exception(e) { } InvalidParameterExcetion &operator= (const ArithmeticExcption &e) { Exception::operator=(e); return *this; } ~InvalidParameterExcetion() override { } }; } #endif // EXCEPTION_H
文件:Exception.cppide
#include "Exception.h" #include <cstring> #include <cstdlib> namespace DTLib { Exception::Exception(const char *message) : Exception(message, nullptr, 0) { } Exception::Exception(const char *file, int line) : Exception(nullptr, file, line) { } Exception::Exception(const char *message, const char *file, int line) { m_message = strdup(message); if (file != nullptr) { char sl[16] = {0}; itoa(line, sl, 10); m_location = static_cast<char*>(malloc(strlen(file) + strlen(sl) + 2)); m_location = strcpy(m_location, file); m_location = strcat(m_location, ":"); m_location = strcat(m_location, sl); } else { m_location = nullptr; } } Exception::Exception(const Exception &e) { m_message = strdup(e.m_message); m_location = strdup(e.m_location); } Exception &Exception::operator= (const Exception &e) { if (this != &e) { free(m_message); free(m_location); m_message = strdup(e.m_message); m_location = strdup(e.m_location); } return *this; } const char *Exception::message() const { return m_message; } const char *Exception::location() const { return m_location; } Exception::~Exception() { delete m_message; delete m_location; } }
文件:main.cppthis
catch (const ArithmeticExcption &e) TEST ..\DTLib\main.cpp:13
在可複用代碼庫設計時,儘可能使用面向對象技術進行架構,儘可能使用異常處理機制分離正常邏輯和異常邏輯。spa
- 如今C++庫必要包含充要的異常類族
- 全部庫中的數據結構都依賴於異常機制
- 異常機制可以分離庫中代碼的正常邏輯和異常邏輯
以上內容整理於狄泰軟件學院系列課程,請你們保護原創!設計