---
sidebar_label: "定数とエラー"
title: "定数とエラー - CyberGo JSON | API リファレンス"
description: "CyberGo JSON 定数とエラー：DefaultMaxJSONSize、DefaultMaxNestingDepth 制限、ErrPathNotFound エラー変数と MergeMode マージモードで、Go 設定を支えます。"
sidebar_position: 7
---

# 定数とエラー

## エラー変数

### 主要なエラー

```go
var (
    // 基本エラー
    ErrInvalidJSON     = errors.New("invalid JSON format")
    ErrPathNotFound    = errors.New("path not found")
    ErrTypeMismatch    = errors.New("type mismatch")
    ErrInvalidPath     = errors.New("invalid path format")
    ErrProcessorClosed = errors.New("processor is closed")

    // 制限エラー
    ErrSizeLimit        = errors.New("size limit exceeded")
    ErrDepthLimit       = errors.New("depth limit exceeded")
    ErrConcurrencyLimit = errors.New("concurrency limit exceeded") // 制御された操作（Get/Set/Delete など）が MaxConcurrency に達したときに返されます

    // セキュリティとバリデーションエラー
    ErrSecurityViolation = errors.New("security violation detected")
    ErrUnsupportedPath   = errors.New("unsupported path operation")

    // リソースとパフォーマンスエラー（いずれも Deprecated：現在どの操作からも返されず、将来の使用のために予約）
    ErrOperationTimeout  = errors.New("operation timeout")
    ErrResourceExhausted = errors.New("system resources exhausted")
)
```

### エラーチェック

`errors.Is` を使用してエラー型をチェックします：

```go
val, err := json.Get(data, "user.name")
if err != nil {
    if errors.Is(err, json.ErrPathNotFound) {
        // パスが存在しない
        fmt.Println("パスが見つかりません")
    } else if errors.Is(err, json.ErrTypeMismatch) {
        // 型が一致しない
        fmt.Println("型が一致しません")
    } else if errors.Is(err, json.ErrInvalidJSON) {
        // JSON 形式エラー
        fmt.Println("無効な JSON")
    }
}
```

## JsonsError 型

### 構造定義

```go
type JsonsError struct {
    Op      string `json:"op"`      // 操作名
    Path    string `json:"path"`    // エラーが発生したパス
    Message string `json:"message"` // 人間可読なエラーメッセージ
    Err     error  `json:"err"`     // 基底エラー
}
```

### メソッド

```go
func (e *JsonsError) Error() string
func (e *JsonsError) Unwrap() error
func (e *JsonsError) Is(target error) bool
```

### 使用例

```go
val, err := json.Get(data, "complex.path[0]")
if err != nil {
    var jsonErr *json.JsonsError
    if errors.As(err, &jsonErr) {
        fmt.Printf("操作: %s\n", jsonErr.Op)
        fmt.Printf("パス: %s\n", jsonErr.Path)
        fmt.Printf("メッセージ: %s\n", jsonErr.Message)
        if jsonErr.Err != nil {
            fmt.Printf("原因: %v\n", jsonErr.Err)
        }
    }
}
```

## エラーヘルパー関数

上記のエラー型に加え、ライブラリは 2 つのエラー処理ヘルパー関数を提供します（詳細は [ヘルパーユーティリティ](./helpers#safeerror) を参照）：

| 関数 | シグネチャ | 説明 |
|------|-----------|------|
| `SafeError` | `func SafeError(err error) string` | クライアントに安全なエラーメッセージを返し、パス名などの内部詳細を省略します（CWE-209） |
| `RedactedPath` | `func RedactedPath(path string) string` | マスク済みのパスを返します（空でないパスは `"***"` にマスクされます）。ログとエラーレスポンスに使用 |

## 設定プリセット

### デフォルト値定数

```go
const (
    // サイズ制限
    DefaultMaxJSONSize     = 100 * 1024 * 1024  // 100MB
    DefaultMaxNestingDepth = 200
    DefaultMaxPathDepth    = 50
    DefaultMaxDepth        = 100                 // エンコード/デコードのデフォルトネスト深度 (Config.MaxDepth)
    DefaultMaxConcurrency  = 50

    // セキュリティ制限
    DefaultMaxSecuritySize   = 10 * 1024 * 1024  // 10MB
    DefaultMaxObjectKeys     = 100000
    DefaultMaxArrayElements  = 100000
    DefaultMaxBatchSize      = 2000
    DefaultParallelThreshold = 10

    // キャッシュ
    DefaultCacheTTL = 5 * time.Minute
)
```

## 設定プリセット関数

### DefaultConfig

シグネチャ：`func DefaultConfig() Config`

デフォルト設定を返します。

```go
cfg := json.DefaultConfig()
processor, err := json.New(cfg)
if err != nil {
    panic(err)
}
defer processor.Close()
```

### SecurityConfig

シグネチャ：`func SecurityConfig() Config`

セキュリティ設定を返します。信頼できない入力の処理に適しています。

```go
// 以下の用途に推奨：
// - パブリック API と Web サービス
// - ユーザー送信データ
// - 外部 Webhook
// - 認証エンドポイント
// - 金融データ処理
cfg := json.SecurityConfig()
processor, err := json.New(cfg)
if err != nil {
    panic(err)
}
defer processor.Close()
```

**セキュリティ設定の特徴**：

- 完全セキュリティスキャン
- 厳格モード
- 控えめな制限値
- キャッシュ有効

### PrettyConfig

シグネチャ：`func PrettyConfig() Config`

フォーマット出力設定を返します。

```go
result, err := json.EncodeWithConfig(data, json.PrettyConfig())
```

## マージモード定数

```go
// MergeMode はマージモード型（internal パッケージからエクスポート）
type MergeMode = internal.MergeMode

const (
    // MergeUnion - ユニオンマージ（デフォルト）
    // オブジェクト：すべてのキーをマージ、競合値は上書き値を使用
    // 配列：すべての要素をマージして重複排除
    MergeUnion = internal.MergeUnion

    // MergeIntersection - 積集合マージ
    // オブジェクト：共通キーのみ保持
    // 配列：共通要素のみ保持
    MergeIntersection = internal.MergeIntersection

    // MergeDifference - 差集合マージ
    // オブジェクト：ベースに存在し上書きに存在しないキーのみ保持
    // 配列：ベースに存在し上書きに存在しない要素のみ保持
    MergeDifference = internal.MergeDifference
)
```

## パスセグメント型

`PathSegment` は `internal` パッケージからエクスポートされたパスセグメント型で、解析後のパス構成要素を表します。

```go
type PathSegment = internal.PathSegment
```

::: warning 内部実装のエイリアス
`PathSegment` は `internal.PathSegment` の型エイリアスです。具体的なフィールド、フィールド型（PathSegmentType、PathSegmentFlags など）およびメソッドは `internal` パッケージに属し、**公開 API としてはエクスポートされていません**。バージョン間で変更される可能性があるため、ビジネスコードで内部構造に直接依存しないでください。

- カスタムパス構文を実装する際は、[`PathParser`](./interfaces#pathparser) インターフェースの `ParsePath` メソッドで `[]PathSegment` を返します。
- プリコンパイル済みパスには [`Processor.CompilePath`](./processor/query#compilepath) を使用し、`*CompiledPath` を返します。
:::

## セキュリティパターンレベル

```go
type PatternLevel int

const (
    // PatternLevelCritical - 重大リスク、常に操作をブロック
    PatternLevelCritical PatternLevel = iota

    // PatternLevelWarning - 警告レベル、厳格モードではブロック
    PatternLevelWarning

    // PatternLevelInfo - 情報レベル、ログ記録のみ
    PatternLevelInfo
)
```

### DangerousPattern 構造体

```go
type DangerousPattern struct {
    Pattern string       // 検出する部分文字列
    Name    string       // 人間可読なセキュリティリスクの説明
    Level   PatternLevel // 処理レベル
}
```

## エラー処理のベストプラクティス

### errors.Is で型をチェック

```go
result, err := json.Get(data, path)
if errors.Is(err, json.ErrPathNotFound) {
    return defaultValue
}
if errors.Is(err, json.ErrTypeMismatch) {
    return defaultValue
}
```

### errors.As で詳細を取得

```go
var jsonErr *json.JsonsError
if errors.As(err, &jsonErr) {
    log.Printf("操作 %s がパス %s で失敗: %s",
        jsonErr.Op, jsonErr.Path, jsonErr.Message)
}
```

### エラーラッピング

```go
val := json.GetString(data, path)
if val == "" {
    return fmt.Errorf("設定 %s の取得で空の値が返されました", path)
}
```

## 関連

- [エラー処理](../advanced/error-handling) - 高度なエラー処理ガイド
- [Config](./config) - 設定オプション
- [セキュリティ概要](../security/) - セキュリティベストプラクティス
