Topik ini menjelaskan cara menangani error pada Go SDK.
Kesalahan di sisi klien
Jika panggilan yang dilakukan oleh Go SDK gagal, SDK tersebut mengembalikan antarmuka error yang didefinisikan sebagai berikut:
type error interface {
Error() string
}Error lainnya mewarisi antarmuka ini. Sebagai contoh, error yang dikembalikan ketika permintaan HTTP gagal didefinisikan sebagai berikut:
//net.Error
type Error interface {
error
Timeout() bool // Apakah kesalahan merupakan timeout
Temporary() bool // Apakah kesalahan bersifat sementara
}Kesalahan di sisi server
Jika permintaan yang dilakukan oleh OSS Go SDK gagal, sebuah error dikembalikan. Untuk masalah seperti error permintaan HTTP atau I/O, error kustom Go dikembalikan. Jika terjadi error pada server OSS, error berikut dikembalikan dan mengimplementasikan antarmuka Error:
type ServiceError struct {
Code string // Kode error yang dikembalikan oleh OSS.
Message string // Pesan error detail dari OSS.
RequestId string // Pengidentifikasi unik universal (UUID) yang secara unik mengidentifikasi permintaan.
HostId string // ID kluster OSS yang diakses.
StatusCode int // Kode status HTTP.
}Jika kode status HTTP yang dikembalikan oleh OSS tidak sesuai dengan yang diharapkan, kesalahan berikut dikembalikan. Kesalahan ini juga mengimplementasikan antarmuka Error.
type UnexpectedStatusCodeError struct {
allowed []int // Kode status HTTP yang diharapkan dari OSS.
got int // Kode status HTTP aktual yang dikembalikan oleh OSS.
}Contoh penanganan kesalahan
Berikut adalah kode yang menunjukkan cara menangani kesalahan:
package main
import (
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// Fungsi penanganan error.
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
/// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instans OSSClient.
// Setel yourEndpoint ke titik akhir bucket. Misalnya, untuk wilayah China (Hangzhou), gunakan https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan titik akhir yang sebenarnya.
// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk wilayah China (Hangzhou), gunakan cn-hangzhou. Untuk wilayah lain, gunakan ID wilayah yang sebenarnya.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi signature.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
HandleError(err)
}
// Tentukan nama bucket, misalnya examplebucket.
bucketName := "examplebucket"
// Tentukan nama objek, misalnya exampleobject.txt.
objectName := "exampleobject.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// Unggah string.
err = bucket.PutObject(objectName, strings.NewReader("Hello OSS"))
if err != nil {
HandleError(err)
}
}
Kode kesalahan OSS
Tabel berikut mencantumkan kode kesalahan OSS.
Kode kesalahan | Deskripsi | Kode status HTTP |
AccessDenied | Akses ditolak. | 403 |
BucketAlreadyExists | Bucket sudah ada. | 409 |
BucketNotEmpty | Bucket tidak kosong. | 409 |
EntityTooLarge | Entitas terlalu besar. | 400 |
EntityTooSmall | Entitas terlalu kecil. | 400 |
FileGroupTooLarge | Grup file terlalu besar. | 400 |
InvalidLinkName | Tautan objek memiliki nama yang sama dengan objek yang ditunjuknya. | 400 |
LinkPartNotExist | Objek yang ditunjuk oleh tautan objek tidak ada. | 400 |
ObjectLinkTooLarge | Jumlah objek dalam tautan objek terlalu besar. | 400 |
FieldItemTooLong | Bidang formulir dalam permintaan POST terlalu besar. | 400 |
FilePartInterity | Bagian file telah berubah. | 400 |
FilePartNotExist | Bagian file tidak ada. | 400 |
FilePartStale | Bagian file sudah usang. | 400 |
IncorrectNumberOfFilesInPOSTRequest | Jumlah file dalam permintaan POST tidak valid. | 400 |
InvalidArgument | Format parameter tidak valid. | 400 |
InvalidAccessKeyId | ID AccessKey tidak ada. | 403 |
InvalidBucketName | Nama bucket tidak valid. | 400 |
InvalidDigest | Digest tidak valid. | 400 |
InvalidEncryptionAlgorithmError | Algoritma enkripsi yang ditentukan untuk entropy encoding tidak valid. | 400 |
InvalidObjectName | Nama objek tidak valid. | 400 |
InvalidPart | Bagian tidak valid. | 400 |
InvalidPartOrder | Urutan bagian tidak valid. | 400 |
InvalidPolicyDocument | Dokumen kebijakan tidak valid. | 400 |
InvalidTargetBucketForLogging | Bucket target untuk operasi logging tidak valid. | 400 |
InternalError | Kesalahan internal terjadi di OSS. | 500 |
MalformedXML | Format XML tidak valid. | 400 |
MalformedPOSTRequest | Format body dari permintaan POST tidak valid. | 400 |
MaxPOSTPreDataLengthExceededError | Isi permintaan POST, tidak termasuk konten file yang diunggah, terlalu besar. | 400 |
MethodNotAllowed | Metode tidak didukung. | 405 |
MissingArgument | Parameter hilang. | 411 |
MissingContentLength | Panjang konten hilang. | 411 |
NoSuchBucket | Bucket tidak ada. | 404 |
NoSuchKey | File tidak ada. | 404 |
NoSuchUpload | ID unggah multi-bagian tidak ada. | 404 |
NotImplemented | Metode tidak dapat diproses. | 501 |
PreconditionFailed | Kesalahan pra-pemrosesan terjadi. | 412 |
RequestTimeTooSkewed | Selisih waktu antara klien dan server OSS lebih dari 15 menit. | 403 |
RequestTimeout | Permintaan habis waktu. | 400 |
RequestIsNotMultiPartContent | Content-Type dari permintaan POST tidak valid. | 400 |
SignatureDoesNotMatch | Signature tidak valid. | 403 |
TooManyBuckets | Jumlah bucket telah melebihi batas. | 400 |
InvalidEncryptionAlgorithmError | Algoritma enkripsi entropy encoding yang ditentukan tidak valid. | 400 |
Pada tabel di atas, Error code berkorespondensi dengan OssServiceError.Code, dan HTTP status code berkorespondensi dengan OssServiceError.StatusCode.