2010-08-09 38 views
13

vẫn phải vật lộn với R, đặc biệt là với xử lý lỗi:Chức năng và thử() trong R

Nếu tôi sử dụng:

result <- try(sqlSave(ch,df,tablename="tblTest")) 

tôi có thể sử dụng:

if (class(result) != "try-error") 

để kiểm tra xem một cái gì đó đã đi sai. Không vấn đề gì.

Nhưng nếu tôi sử dụng try kết hợp với một chức năng nó không hoạt động như tôi mong đợi:

result <- try(ch<-odbcConnect("TEST")) 

cho "-1" cho result và "số nguyên" cho class(result)

Vì vậy, nên tôi sử dụng

ch<-odbcConnect("TEST") 
if (ch != -1) 

và sử dụng geterrmessage() cho thông báo lỗi?

Trả lời

8

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ị.

+0

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

+0

Cảm ơn sự bổ sung và giải thích rõ ràng – waanders

+0

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

Các vấn đề liên quan