Nếu bạn đọc thông báo lỗi chặt chẽ, bạn có thể thấy rằng odbcConnect
cho bạn cảnh báo. Lỗi được tạo ra bởi trình điều khiển ODBC và nó không phải là lỗi trong try
ý nghĩa (geterrmessage()
sẽ không hoạt động hoặc).
Bạn có thể sử dụng tryCatch
để xử lý này, ví dụ .:
tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!"))
Một số giải thích thêm:
-1 là kết quả của odbcDriverConnect
chức năng. Nếu bạn xem mã có các dòng
stat <- .Call(C_RODBCDriverConnect, as.character(connection),
id, as.integer(believeNRows), as.logical(readOnlyOptimize))
if (stat < 0L) {
warning("ODBC connection failed")
return(stat)
}
Vì vậy, bạn kết thúc mà không có lỗi (và cảnh báo) và với mã nguyên từ cấp C. Trên thực tế mã này được trả về khi kết nối thành công quá (nhưng sau đó bằng 1). Khi không có lỗi thì lớp kết quả không được là try-error
.
Nó không phải là vấn đề với try
và chức năng nhưng cụ thể của chức năng cụ thể này (odbcDriverConnect
).
Bạn dĩ nhiên có thể sử dụng hành vi này như trong ví dụ của bạn
ch <- odbcConnect("TEST")
if (ch != -1)
Với tryCatch
bạn có thể làm
tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!"))
mà tạo ra ch
biến khi thành công và thông điệp in khi thất bại.
Hoặc
ch <- tryCatch(odbcConnect("TEST"), warning=function(w) {print("FAIL!");return(NA)})
mà luôn luôn tạo ra ch
biến nhưng trong trường hợp thất bại có NA
giá trị.
Nhưng tôi vẫn không hiểu tại sao lớp học (kết quả) cho "số nguyên" với một cuộc gọi chức năng và nếu không "try-error". Và tôi lưu trữ biến kênh của odbcConnect trong ví dụ ở đâu? – waanders
Cảm ơn sự bổ sung và giải thích rõ ràng – waanders
Chỉ một câu hỏi: Tại sao không - df <- tryCatch (sqlQuery (ch, dán ("SELECT * FROM tblTest")), warning = function (w) {print (" FAIL! "); Return (NA)}) - làm việc giống nhau không? Tôi không nhận được một cảnh báo in và "df" chứa thông báo lỗi không phải là một giá trị "NA" – waanders