> ## Documentation Index
> Fetch the complete documentation index at: https://docs.facebetter.net/llms.txt
> Use this file to discover all available pages before exploring further.

# エラー処理

> Facebetter SDK 2.0 のエラーコードと Windows の切り分け

<Note>
  SDK **2.0.0**。認証: [認証とライセンス](/ja/intro/license)。
</Note>

## 戻り値

ほとんどの setter は `int` を返します。

| コード  | 意味                  |
| ---- | ------------------- |
| `0`  | 成功                  |
| `-1` | 引数不正                |
| `-2` | 未初期化                |
| `-3` | ライセンス               |
| `-4` | 非対応                 |
| `-5` | I/O                 |
| `-6` | 空きスロットなし（バックプレッシャー） |
| `-7` | 処理失敗                |
| `-8` | メモリ不足               |

`BeautyEffectEngine::Create()` は `std::shared_ptr` を返し、失敗時は `nullptr` です。`ProcessImage` 失敗も空ポインタを返すことがあります。

```cpp theme={null}
int ret = engine->SetSmoothing(0.5f);
if (ret != 0) {
    std::cerr << "SetSmoothing failed: " << ret << std::endl;
}
```

## エンジンイベント

`Create` のあと `on_engine_event` を登録します。

| コード   | 意味    |
| ----- | ----- |
| `0`   | 認証成功  |
| `1`   | 認証失敗  |
| `100` | 初期化完了 |
| `101` | 初期化失敗 |

失敗時、`message` に詳細があります。

```cpp theme={null}
EngineCallbacks cbs;
cbs.on_engine_event = [](int code, const std::string& message) {
    if (code == 1 || code == 101) {
        std::cerr << "engine event " << code << ": " << message << std::endl;
    }
};
engine->SetCallbacks(cbs);
```

***

## よくある失敗

### 1. `Create` が `nullptr` を返す

よくある原因:

* `resource_path` がディレクトリ、パス誤り、または `resource.fbd` **ファイル**ではない
* `app_id` + `app_key` が無効、または `license_token` が誤り
* `facebetter.dll` がない、または `facebetter.lib` と一致しない
* `/facebetter/v2/auth` に到達できない

必ず `Create` の**前**にログを開きます。

```cpp theme={null}
LogConfig log_cfg;
log_cfg.console_enabled = true;
log_cfg.level = LogLevel::Debug;
BeautyEffectEngine::SetLogConfig(log_cfg);

EngineConfig cfg;
cfg.app_id = "your_app_id";
cfg.app_key = "your_app_key";
cfg.resource_path =
    (std::filesystem::current_path() / "resource" / "resource.fbd").string();

auto engine = BeautyEffectEngine::Create(cfg);
if (!engine) {
    std::cerr << "Create failed: check logs, resource.fbd, and license." << std::endl;
    return -1;
}
```

***

### 2. `facebetter.dll` が見つからない

DLL が読み込みパスにない場合、Windows はダイアログを出します。

```bat theme={null}
dir build\facebetter.dll
copy sdk\lib\facebetter.dll build\
```

または再ビルドして、CMake が実行ファイルの隣へコピーするようにします。

***

### 3. `ProcessImage` が `nullptr` を返す

入力フレーム、エンジンポインタ、ログ（setter の `-7` 処理失敗 / `-8` メモリ不足）を確認します。

```cpp theme={null}
auto input = ImageFrame::CreateWithFile("input.jpg");
if (!input || !input->Data()) {
    std::cerr << "Failed to load input." << std::endl;
    return;
}
input->type = FrameType::Image;
auto output = engine->ProcessImage(input);
if (!output || !output->Data()) {
    std::cerr << "ProcessImage failed." << std::endl;
}
```

***

### 4. 効果が変わって見えない

2.0 には `SetBeautyTypeEnabled` **はありません**。強度 `0` はオフです。リシェイプ / メイクには顔検出も必要です。

```cpp theme={null}
engine->SetSmoothing(0.5f);
engine->SetReshape(Reshape::FaceThin, 0.3f);
engine->SetLipstick(0.5f);
input->type = FrameType::Video;
```

***

### 5. OpenGL / 表示

ドライバが古い、VM、GPU のないリモートデスクトップでは GLFW / `gladLoadGLLoader` が失敗することがあります。

```cpp theme={null}
if (!glfwInit()) {
    std::cerr << "GLFW init failed." << std::endl;
    return 1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
```

アプリがすでに GL コンテキストを持っている場合は `EngineConfig::external_context = true` を設定し、そのスレッドで `ProcessImage` を呼び出します。

***

## デバッグログ

```cpp theme={null}
LogConfig log_cfg;
log_cfg.console_enabled = true;
log_cfg.file_enabled = true;
log_cfg.level = LogLevel::Debug;
log_cfg.file_name = "facebetter.log";
BeautyEffectEngine::SetLogConfig(log_cfg);
```

絶対パスを使わない場合、ログファイルは現在の作業ディレクトリ相対で書き込まれます。
