このトピックでは、Go SDK のエラー処理方法について説明します。
クライアント側のエラー
Go SDK による呼び出しが失敗した場合、エラーインターフェイスが返されます。このインターフェイスは、次のように定義されています。
type error interface {
Error() string
}他のエラーは、このインターフェイスを継承します。たとえば、HTTP リクエストが失敗したときに返されるエラーは、次のように定義されています。
//net.Error
type Error interface {
error
Timeout() bool // エラーがタイムアウトであるかどうか
Temporary() bool // エラーが一時的なものであるかどうか
}サーバー側のエラー
OSS Go SDK によるリクエストが失敗した場合、エラーが返されます。HTTP リクエストや I/O エラーなどの問題については、カスタム Go エラーが返されます。OSS サーバーでエラーが発生した場合は、次のエラーが返されます。このエラーは Error インターフェイスを実装しています。
type ServiceError struct {
Code string // OSS から返されたエラーコード。
Message string // OSS からの詳細なエラーメッセージ。
RequestId string // リクエストを一意に識別する汎用一意識別子 (UUID)。
HostId string // アクセス先の OSS クラスターの ID。
StatusCode int // HTTP ステータスコード。
}OSS によって返された HTTP ステータスコードが期待されるコードと一致しない場合、次のエラーが返されます。このエラーも Error インターフェイスを実装します。
type UnexpectedStatusCodeError struct {
allowed []int // OSS から期待される HTTP ステータスコード。
got int // OSS から実際に返された HTTP ステータスコード。
}エラー処理の例
次のコードは、エラーを処理する方法を示しています。
package main
import (
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// エラー処理関数。
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
/// 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンの場合は、https://oss-cn-hangzhou.aliyuncs.com を使用します。他のリージョンについては、実際のエンドポイントを使用してください。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンの場合は、cn-hangzhou を使用します。他のリージョンについては、実際のリージョン ID を使用してください。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
HandleError(err)
}
// バケット名を指定します (例: examplebucket)。
bucketName := "examplebucket"
// オブジェクト名を指定します (例: exampleobject.txt)。
objectName := "exampleobject.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 文字列をアップロードします。
err = bucket.PutObject(objectName, strings.NewReader("Hello OSS"))
if err != nil {
HandleError(err)
}
}
OSS エラーコード
次の表に OSS エラーコードを一覧表示します。
エラーコード | 説明 | HTTP ステータスコード |
AccessDenied | アクセスが拒否されました。 | 403 |
BucketAlreadyExists | バケットはすでに存在します。 | 409 |
BucketNotEmpty | バケットは空ではありません。 | 409 |
EntityTooLarge | エンティティが大きすぎます。 | 400 |
EntityTooSmall | エンティティが小さすぎます。 | 400 |
FileGroupTooLarge | ファイルグループが大きすぎます。 | 400 |
InvalidLinkName | オブジェクトリンクの名前が、リンク先のオブジェクトと同じです。 | 400 |
LinkPartNotExist | オブジェクトリンクが指すオブジェクトが存在しません。 | 400 |
ObjectLinkTooLarge | オブジェクトリンク内のオブジェクト数が多すぎます。 | 400 |
FieldItemTooLong | POST リクエストのフォームフィールドが大きすぎます。 | 400 |
FilePartInterity | ファイルパートが変更されました。 | 400 |
FilePartNotExist | ファイルパートが存在しません。 | 400 |
FilePartStale | ファイルパートが古くなっています。 | 400 |
IncorrectNumberOfFilesInPOSTRequest | POST リクエスト内のファイル数が無効です。 | 400 |
InvalidArgument | パラメーターのフォーマットが無効です。 | 400 |
InvalidAccessKeyId | AccessKey ID が存在しません。 | 403 |
InvalidBucketName | バケット名が無効です。 | 400 |
InvalidDigest | ダイジェストが無効です。 | 400 |
InvalidEncryptionAlgorithmError | 指定されたエントロピーエンコーディングの暗号化アルゴリズムが無効です。 | 400 |
InvalidObjectName | オブジェクト名が無効です。 | 400 |
InvalidPart | パートが無効です。 | 400 |
InvalidPartOrder | パートの順序が無効です。 | 400 |
InvalidPolicyDocument | ポリシードキュメントが無効です。 | 400 |
InvalidTargetBucketForLogging | ロギング操作のターゲットバケットが無効です。 | 400 |
InternalError | OSS で内部エラーが発生しました。 | 500 |
MalformedXML | XML フォーマットが無効です。 | 400 |
MalformedPOSTRequest | POST リクエストの本文フォーマットが無効です。 | 400 |
MaxPOSTPreDataLengthExceededError | アップロードされたファイルコンテンツを除く POST リクエストの本文が大きすぎます。 | 400 |
MethodNotAllowed | このメソッドはサポートされていません。 | 405 |
MissingArgument | パラメーターがありません。 | 411 |
MissingContentLength | コンテンツの長さがありません。 | 411 |
NoSuchBucket | バケットが存在しません。 | 404 |
NoSuchKey | ファイルが存在しません。 | 404 |
NoSuchUpload | マルチパートアップロード ID が存在しません。 | 404 |
NotImplemented | このメソッドは処理できません。 | 501 |
PreconditionFailed | 事前処理エラーが発生しました。 | 412 |
RequestTimeTooSkewed | クライアントと OSS サーバー間の時刻差が 15 分を超えています。 | 403 |
RequestTimeout | リクエストがタイムアウトしました。 | 400 |
RequestIsNotMultiPartContent | POST リクエストの Content-Type が無効です。 | 400 |
SignatureDoesNotMatch | 署名が無効です。 | 403 |
TooManyBuckets | バケット数が上限を超えました。 | 400 |
InvalidEncryptionAlgorithmError | 指定されたエントロピーエンコーディングの暗号化アルゴリズムが無効です。 | 400 |
上記の表では、エラーコード は OssServiceError.Code に対応し、HTTP ステータスコード は OssServiceError.StatusCode に対応します。