|
1 | 1 | use arrow_schema::ArrowError; |
2 | 2 | use deltalake::datafusion::error::DataFusionError; |
| 3 | +use deltalake::kernel::Error as KernelError; |
3 | 4 | use deltalake::{errors::DeltaTableError, ObjectStoreError}; |
4 | 5 | use pyo3::exceptions::{ |
5 | 6 | PyException, PyFileNotFoundError, PyIOError, PyNotImplementedError, PyRuntimeError, |
@@ -35,7 +36,12 @@ fn inner_to_py_err(err: DeltaTableError) -> PyErr { |
35 | 36 | DeltaTableError::Transaction { source } => CommitFailedError::new_err(source.to_string()), |
36 | 37 |
|
37 | 38 | // python exceptions |
38 | | - DeltaTableError::ObjectStore { source } => object_store_to_py(source), |
| 39 | + DeltaTableError::ObjectStore { source } => object_store_to_py(source, None), |
| 40 | + DeltaTableError::Kernel { source } => match source { |
| 41 | + KernelError::ObjectStore(e) => object_store_to_py(e, Some("Kernel error".to_string())), |
| 42 | + other => DeltaError::new_err(DeltaTableError::Kernel { source: other }.to_string()), |
| 43 | + }, |
| 44 | + |
39 | 45 | DeltaTableError::Io { source } => PyIOError::new_err(source.to_string()), |
40 | 46 |
|
41 | 47 | DeltaTableError::Arrow { source } => arrow_to_py(source), |
@@ -91,27 +97,37 @@ impl<T: Error + 'static> Display for DisplaySourceChain<T> { |
91 | 97 | } |
92 | 98 | } |
93 | 99 |
|
94 | | -fn object_store_to_py(err: ObjectStoreError) -> PyErr { |
95 | | - match err { |
96 | | - ObjectStoreError::NotFound { .. } => PyFileNotFoundError::new_err( |
| 100 | +fn object_store_to_py(err: ObjectStoreError, source_error: Option<String>) -> PyErr { |
| 101 | + if let Some(source_error) = source_error { |
| 102 | + PyIOError::new_err( |
97 | 103 | DisplaySourceChain { |
98 | 104 | err, |
99 | | - error_name: "FileNotFoundError".to_string(), |
| 105 | + error_name: format!("{} -> IOError", source_error), |
100 | 106 | } |
101 | 107 | .to_string(), |
102 | | - ), |
103 | | - ObjectStoreError::Generic { source, .. } |
104 | | - if source.to_string().contains("AWS_S3_ALLOW_UNSAFE_RENAME") => |
105 | | - { |
106 | | - DeltaProtocolError::new_err(source.to_string()) |
107 | | - } |
108 | | - _ => PyIOError::new_err( |
109 | | - DisplaySourceChain { |
110 | | - err, |
111 | | - error_name: "IOError".to_string(), |
| 108 | + ) |
| 109 | + } else { |
| 110 | + match err { |
| 111 | + ObjectStoreError::NotFound { .. } => PyFileNotFoundError::new_err( |
| 112 | + DisplaySourceChain { |
| 113 | + err, |
| 114 | + error_name: "FileNotFoundError".to_string(), |
| 115 | + } |
| 116 | + .to_string(), |
| 117 | + ), |
| 118 | + ObjectStoreError::Generic { source, .. } |
| 119 | + if source.to_string().contains("AWS_S3_ALLOW_UNSAFE_RENAME") => |
| 120 | + { |
| 121 | + DeltaProtocolError::new_err(source.to_string()) |
112 | 122 | } |
113 | | - .to_string(), |
114 | | - ), |
| 123 | + _ => PyIOError::new_err( |
| 124 | + DisplaySourceChain { |
| 125 | + err, |
| 126 | + error_name: "IOError".to_string(), |
| 127 | + } |
| 128 | + .to_string(), |
| 129 | + ), |
| 130 | + } |
115 | 131 | } |
116 | 132 | } |
117 | 133 |
|
@@ -154,7 +170,7 @@ impl From<PythonError> for pyo3::PyErr { |
154 | 170 | fn from(value: PythonError) -> Self { |
155 | 171 | match value { |
156 | 172 | PythonError::DeltaTable(err) => inner_to_py_err(err), |
157 | | - PythonError::ObjectStore(err) => object_store_to_py(err), |
| 173 | + PythonError::ObjectStore(err) => object_store_to_py(err, None), |
158 | 174 | PythonError::Arrow(err) => arrow_to_py(err), |
159 | 175 | PythonError::DataFusion(err) => datafusion_to_py(err), |
160 | 176 | PythonError::ThreadingError(err) => PyRuntimeError::new_err(err), |
|
0 commit comments