跳至主要內容
產品桌面工具TASTECAD圖面檢視TASTEFILES檔案管理TASTEFTP檔案傳輸TASTESSH遠端工作空間TASTEZIP壓縮與解壓縮開發工具TASTECODERust 整合開發環境TASTESTUDIO整合開發與測試環境TASTEETL資料整合(ETL)伺服器TASTEREMOTE遠端桌面伺服器TASTEGEO空間資訊伺服器TASTEMAIL郵件工作空間開始使用下載文件購買所有產品
市集
資訊
技術資訊今日開發資訊開發文件程式語言RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartWeb 前端框架Next.jsReactVue.js · NuxtSvelteKitAngular伺服器框架Spring BootDjangoFastAPIASP.NET CoreNestJS · Express應用程式與桌面框架TauriFlutterReact NativeElectron演算法演算法基礎核心演算法進階演算法實務演算法
社群專案開發日誌提示詞AI 工具問題作品展示社群指南
合作技術傳授網站建置桌面應用程式建置發布與付款流程銷售合作夥伴聯絡我們
服務遠端桌面安裝包客製
TASTEDEV
產品

桌面工具

TASTECAD再複雜的圖面,也能輕鬆開啟TASTEFILES只挑需要的檔案,最快送達TASTEFTP讓檔案往來,走最俐落的路TASTESSH在你與伺服器之間,築起更穩固的連線TASTEZIP壓得更快,解得更安心

開發工具

TASTECODE在一個視窗中完成 Rust 應用程式的編輯、建置、偵錯與測試TASTESTUDIO從編輯到遠端測試,再到經核准的 AI 修正TASTEETL邊看數值,邊搬資料

伺服器

TASTEREMOTE在自己的伺服器上運行的遠端桌面TASTEGEO以 Rust 重新打造相容 GeoServer 的空間資訊伺服器TASTEMAIL把郵件的主導權拿回自己手上

開始使用

下載所有產品的最新版本文件各產品使用方法購買訂閱與永久授權所有產品一覽全部產品
所有產品
市集資訊
技術

資訊

今日開發資訊語言、框架、GitHub 與 AI 官方發布開發文件語言、框架與演算法指南

程式語言

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

框架

Web 前端框架Next.jsReactVue.js · NuxtSvelteKitAngular
伺服器框架Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
應用程式與桌面框架TauriFlutterReact NativeElectron

演算法

演算法基礎複雜度分析 · 排序 · 搜尋 · 基礎資料結構 · 樹與堆積核心演算法圖形走訪 · 最短路徑與最小生成樹 · 動態規劃 · 貪婪演算法 · 分治法 · 回溯法進階演算法字串演算法 · 數學與數論 · 位元運算 · 線段樹 · 併查集實務演算法程式面試解題策略 · LRU 快取 · 速率限制 · 一致性雜湊
查看全部開發文件
社群
專案探索開發者與作品開發日誌決策與試錯提示詞可重複使用的指令AI 工具問題Claude、Codex、Gemini 的問題與替代做法作品展示已完成的成果社群指南我們如何公開打造
合作
技術傳授用 Rust 與 egui 打造原生應用程式網站建置10 種語言、帳號、文件與下載桌面應用程式建置Rust 與 egui,不用 WebView發布與付款流程簽章、MSI、deb、rpm、AppImage、雜湊銷售合作夥伴推薦即得 30%聯絡我們開發、合作與投資諮詢
服務
遠端桌面用瀏覽器連線你的電腦安裝包客製只裝需要的,設定預先放好
購買
繁
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
登入
登入
TASTEDEV

從小工具到更好的開發。

support@tastedev.net支持 TASTEDEV
產品產品系列購買文件下載市集客戶支援
社群專案開發日誌提示詞AI 工具問題作品展示
政策隱私權政策服務條款訂閱條款退款政策社群規範
帳戶登入註冊
訪客
今天
012345678901234567890123456789012345678901234567890123456789
昨天
012345678901234567890123456789012345678901234567890123456789
累計瀏覽
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
公司名稱
GXSOFT
負責人
CHOI YOUNG GU
營業登記號碼
853-44-00368
地址
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
電話
+82-10-4404-1523
電子郵件
whitecalvin@tastedev.net
個人資料保護負責人
CHOI YOUNG GU

© 2026 TASTEDEV產品資訊以經驗證的開發原始碼為準。已發布·持續改進

C++ 文件
C++
Getting StartedSyntax BasicsTypes and DataModules and PackagesErrors and TestingKey Concepts
討論

C++ 指南 · 5/6

Errors and Testing

本章目前僅提供英文版。

C++ offers several ways to deal with failure: exceptions, return types that carry success or failure (std::optional, std::expected), and assertions for catching bugs. This chapter shows when to use each, then writes unit tests with GoogleTest and Catch2.

Exceptions

You raise an exception with throw and handle it with try/catch. All standard library exceptions derive from std::exception, whose what() member returns a description.

#include <iostream>
#include <stdexcept>
#include <string>

int parse_port(const std::string& text) {
    int port = std::stoi(text);   // throws std::invalid_argument if not a number
    if (port < 1 || port > 65535) {
        throw std::out_of_range("port out of range: " + text);
    }
    return port;
}

int main() {
    try {
        std::cout << parse_port("8080") << '\n';
        std::cout << parse_port("70000") << '\n';
    } catch (const std::out_of_range& e) {
        std::cerr << "range error: " << e.what() << '\n';
    } catch (const std::exception& e) {
        std::cerr << "other error: " << e.what() << '\n';
    }
}

Catch by const reference. Catching by value makes a copy and can slice away the derived part of the exception. Handlers are tried top to bottom, so list the most specific types first.

As an exception propagates, destructors of the local objects it passes run in turn (stack unwinding). That is why resources tied to objects (RAII, next chapter) don't leak on errors.

noexcept

noexcept promises that no exception escapes a function; if one does, std::terminate is called. It matters in practice: standard containers move elements during reallocation only when the move constructor is noexcept, and copy otherwise. Mark moves, destructors and swap this way.

#include <cstddef>

class Buffer {
public:
    Buffer(Buffer&& other) noexcept;            // move constructor
    Buffer& operator=(Buffer&& other) noexcept; // move assignment
    ~Buffer();                                  // destructors are noexcept by default
    std::size_t size() const noexcept { return size_; }
private:
    std::size_t size_ = 0;
};

std::optional and std::expected

When "no result" is a normal outcome, encoding it in the return type reads better than throwing.

  • std::optional<T> (C++17, header <optional>) holds either a value or nothing. It doesn't say why the value is missing.
  • std::expected<T, E> (C++23, header <expected>) holds either a value of type T or an error of type E. You need a compiler and standard library with C++23 support.
對本章有疑問嗎?
上一章Modules and Packages下一章Key Concepts
#include <map> #include <optional> #include <string> std::optional<int> find_age(const std::map<std::string, int>& people, const std::string& name) { if (auto it = people.find(name); it != people.end()) { return it->second; } return std::nullopt; } // if (auto age = find_age(people, "Kim")) { use(*age); } // int a = find_age(people, "Park").value_or(0);
#include <expected>
#include <string>

enum class ParseError { Empty, NotNumber };

std::expected<int, ParseError> to_int(const std::string& s) {
    if (s.empty()) return std::unexpected(ParseError::Empty);
    int value = 0;
    for (char c : s) {
        if (c < '0' || c > '9') return std::unexpected(ParseError::NotNumber);
        value = value * 10 + (c - '0');
    }
    return value;
}

// auto r = to_int("42");
// if (r) { use(*r); } else if (r.error() == ParseError::Empty) { ... }

Assertions

assert from <cassert> checks conditions that can only fail because of a bug; on failure it prints a diagnostic and aborts. Builds that define NDEBUG (such as CMake's Release configuration) remove the checks, so never use it to validate user input. Compile-time conditions belong in static_assert.

#include <cassert>
#include <cstdint>
#include <vector>

static_assert(sizeof(std::int32_t) == 4, "int32_t must be 4 bytes");

int last(const std::vector<int>& v) {
    assert(!v.empty() && "last() called on an empty vector");
    return v.back();
}

Unit tests with GoogleTest

GoogleTest is one of the most popular C++ test frameworks. CMake's FetchContent can build it with your project; set GIT_TAG to a GoogleTest release tag.

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        <release-tag>
)
FetchContent_MakeAvailable(googletest)

enable_testing()
add_executable(math_test tests/math_test.cpp)
target_link_libraries(math_test PRIVATE mathx GTest::gtest_main)

include(GoogleTest)
gtest_discover_tests(math_test)
#include <gtest/gtest.h>
#include "math_utils.hpp"

TEST(GcdTest, ReturnsGreatestCommonDivisor) {
    EXPECT_EQ(mathx::gcd(12, 18), 6);
    EXPECT_EQ(mathx::gcd(7, 5), 1);
}

TEST(GcdTest, ZeroIsHandled) {
    ASSERT_EQ(mathx::gcd(9, 0), 9);   // stops this test immediately on failure
}

A failed EXPECT_* records the failure and continues; a failed ASSERT_* ends the test. After building, ctest --test-dir build runs all tests.

Catch2

Catch2 favors descriptive test names and a small set of macros such as REQUIRE and CHECK. In Catch2 v3, linking against the Catch2::Catch2WithMain target supplies main for you.

#include <catch2/catch_test_macros.hpp>
#include "math_utils.hpp"

TEST_CASE("gcd returns the greatest common divisor", "[math]") {
    REQUIRE(mathx::gcd(12, 18) == 6);
    CHECK(mathx::gcd(7, 5) == 1);
}

Summary

  • Catch exceptions by const reference, most specific type first.
  • Mark functions that cannot fail, such as moves and destructors, noexcept.
  • Return std::optional (C++17) when a value may be absent, and std::expected (C++23) when the caller needs to know why.
  • Use assert to catch programming errors during development, and static_assert for compile-time checks.
  • Write tests with GoogleTest or Catch2 and run them through CTest.

0 則留言

熱門留言由新到舊

登入 · 登入後即可留言。