Skip to content

Commit e39cd30

Browse files
authored
Fix exception causes in 14 modules (#32235)
1 parent 9535246 commit e39cd30

File tree

14 files changed

+63
-61
lines changed

14 files changed

+63
-61
lines changed

pandas/io/sql.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ def read_sql_table(
238238
meta = MetaData(con, schema=schema)
239239
try:
240240
meta.reflect(only=[table_name], views=True)
241-
except sqlalchemy.exc.InvalidRequestError:
242-
raise ValueError(f"Table {table_name} not found")
241+
except sqlalchemy.exc.InvalidRequestError as err:
242+
raise ValueError(f"Table {table_name} not found") from err
243243

244244
pandas_sql = SQLDatabase(con, meta=meta)
245245
table = pandas_sql.read_table(
@@ -685,7 +685,7 @@ def insert_data(self):
685685
try:
686686
temp.reset_index(inplace=True)
687687
except ValueError as err:
688-
raise ValueError(f"duplicate name in index/columns: {err}")
688+
raise ValueError(f"duplicate name in index/columns: {err}") from err
689689
else:
690690
temp = self.frame
691691

@@ -1387,8 +1387,8 @@ def _create_sql_schema(self, frame, table_name, keys=None, dtype=None):
13871387
def _get_unicode_name(name):
13881388
try:
13891389
uname = str(name).encode("utf-8", "strict").decode("utf-8")
1390-
except UnicodeError:
1391-
raise ValueError(f"Cannot convert identifier to UTF-8: '{name}'")
1390+
except UnicodeError as err:
1391+
raise ValueError(f"Cannot convert identifier to UTF-8: '{name}'") from err
13921392
return uname
13931393

13941394

pandas/io/stata.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -1161,8 +1161,8 @@ def f(typ: int) -> Union[int, str]:
11611161
return typ
11621162
try:
11631163
return self.TYPE_MAP_XML[typ]
1164-
except KeyError:
1165-
raise ValueError(f"cannot convert stata types [{typ}]")
1164+
except KeyError as err:
1165+
raise ValueError(f"cannot convert stata types [{typ}]") from err
11661166

11671167
typlist = [f(x) for x in raw_typlist]
11681168

@@ -1171,8 +1171,8 @@ def g(typ: int) -> Union[str, np.dtype]:
11711171
return str(typ)
11721172
try:
11731173
return self.DTYPE_MAP_XML[typ]
1174-
except KeyError:
1175-
raise ValueError(f"cannot convert stata dtype [{typ}]")
1174+
except KeyError as err:
1175+
raise ValueError(f"cannot convert stata dtype [{typ}]") from err
11761176

11771177
dtyplist = [g(x) for x in raw_typlist]
11781178

@@ -1296,14 +1296,14 @@ def _read_old_header(self, first_char: bytes) -> None:
12961296

12971297
try:
12981298
self.typlist = [self.TYPE_MAP[typ] for typ in typlist]
1299-
except ValueError:
1299+
except ValueError as err:
13001300
invalid_types = ",".join(str(x) for x in typlist)
1301-
raise ValueError(f"cannot convert stata types [{invalid_types}]")
1301+
raise ValueError(f"cannot convert stata types [{invalid_types}]") from err
13021302
try:
13031303
self.dtyplist = [self.DTYPE_MAP[typ] for typ in typlist]
1304-
except ValueError:
1304+
except ValueError as err:
13051305
invalid_dtypes = ",".join(str(x) for x in typlist)
1306-
raise ValueError(f"cannot convert stata dtypes [{invalid_dtypes}]")
1306+
raise ValueError(f"cannot convert stata dtypes [{invalid_dtypes}]") from err
13071307

13081308
if self.format_version > 108:
13091309
self.varlist = [
@@ -1761,7 +1761,7 @@ def _do_convert_categoricals(
17611761
categories.append(category) # Partially labeled
17621762
try:
17631763
cat_data.categories = categories
1764-
except ValueError:
1764+
except ValueError as err:
17651765
vc = Series(categories).value_counts()
17661766
repeated_cats = list(vc.index[vc > 1])
17671767
repeats = "-" * 80 + "\n" + "\n".join(repeated_cats)
@@ -1777,7 +1777,7 @@ def _do_convert_categoricals(
17771777
The repeated labels are:
17781778
{repeats}
17791779
"""
1780-
raise ValueError(msg)
1780+
raise ValueError(msg) from err
17811781
# TODO: is the next line needed above in the data(...) method?
17821782
cat_series = Series(cat_data, index=data.index)
17831783
cat_converted_data.append((col, cat_series))
@@ -3143,11 +3143,11 @@ def _write_variable_labels(self) -> None:
31433143
raise ValueError("Variable labels must be 80 characters or fewer")
31443144
try:
31453145
encoded = label.encode(self._encoding)
3146-
except UnicodeEncodeError:
3146+
except UnicodeEncodeError as err:
31473147
raise ValueError(
31483148
"Variable labels must contain only characters that "
31493149
f"can be encoded in {self._encoding}"
3150-
)
3150+
) from err
31513151

31523152
bio.write(_pad_bytes_new(encoded, vl_len + 1))
31533153
else:

pandas/tests/extension/arrow/arrays.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ def _reduce(self, method, skipna=True, **kwargs):
148148

149149
try:
150150
op = getattr(arr, method)
151-
except AttributeError:
152-
raise TypeError
151+
except AttributeError as err:
152+
raise TypeError from err
153153
return op(**kwargs)
154154

155155
def any(self, axis=0, out=None):

pandas/tests/extension/decimal/array.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,10 @@ def _reduce(self, name, skipna=True, **kwargs):
183183

184184
try:
185185
op = getattr(self.data, name)
186-
except AttributeError:
187-
raise NotImplementedError(f"decimal does not support the {name} operation")
186+
except AttributeError as err:
187+
raise NotImplementedError(
188+
f"decimal does not support the {name} operation"
189+
) from err
188190
return op(axis=0)
189191

190192

pandas/tests/extension/json/array.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,13 @@ def take(self, indexer, allow_fill=False, fill_value=None):
137137
output = [
138138
self.data[loc] if loc != -1 else fill_value for loc in indexer
139139
]
140-
except IndexError:
141-
raise IndexError(msg)
140+
except IndexError as err:
141+
raise IndexError(msg) from err
142142
else:
143143
try:
144144
output = [self.data[loc] for loc in indexer]
145-
except IndexError:
146-
raise IndexError(msg)
145+
except IndexError as err:
146+
raise IndexError(msg) from err
147147

148148
return self._from_sequence(output)
149149

pandas/tests/extension/list/array.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ def take(self, indexer, allow_fill=False, fill_value=None):
8686
output = [
8787
self.data[loc] if loc != -1 else fill_value for loc in indexer
8888
]
89-
except IndexError:
90-
raise IndexError(msg)
89+
except IndexError as err:
90+
raise IndexError(msg) from err
9191
else:
9292
try:
9393
output = [self.data[loc] for loc in indexer]
94-
except IndexError:
95-
raise IndexError(msg)
94+
except IndexError as err:
95+
raise IndexError(msg) from err
9696

9797
return self._from_sequence(output)
9898

pandas/tests/indexes/datetimes/test_tools.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1110,8 +1110,8 @@ def test_unit(self, cache):
11101110
for val in ["foo", Timestamp("20130101")]:
11111111
try:
11121112
to_datetime(val, errors="raise", unit="s", cache=cache)
1113-
except tslib.OutOfBoundsDatetime:
1114-
raise AssertionError("incorrect exception raised")
1113+
except tslib.OutOfBoundsDatetime as err:
1114+
raise AssertionError("incorrect exception raised") from err
11151115
except ValueError:
11161116
pass
11171117

pandas/tests/io/test_sql.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -2575,39 +2575,39 @@ def setup_class(cls):
25752575
pymysql.connect(host="localhost", user="root", passwd="", db="pandas_nosetest")
25762576
try:
25772577
pymysql.connect(read_default_group="pandas")
2578-
except pymysql.ProgrammingError:
2578+
except pymysql.ProgrammingError as err:
25792579
raise RuntimeError(
25802580
"Create a group of connection parameters under the heading "
25812581
"[pandas] in your system's mysql default file, "
25822582
"typically located at ~/.my.cnf or /etc/.my.cnf."
2583-
)
2584-
except pymysql.Error:
2583+
) from err
2584+
except pymysql.Error as err:
25852585
raise RuntimeError(
25862586
"Cannot connect to database. "
25872587
"Create a group of connection parameters under the heading "
25882588
"[pandas] in your system's mysql default file, "
25892589
"typically located at ~/.my.cnf or /etc/.my.cnf."
2590-
)
2590+
) from err
25912591

25922592
@pytest.fixture(autouse=True)
25932593
def setup_method(self, request, datapath):
25942594
pymysql = pytest.importorskip("pymysql")
25952595
pymysql.connect(host="localhost", user="root", passwd="", db="pandas_nosetest")
25962596
try:
25972597
pymysql.connect(read_default_group="pandas")
2598-
except pymysql.ProgrammingError:
2598+
except pymysql.ProgrammingError as err:
25992599
raise RuntimeError(
26002600
"Create a group of connection parameters under the heading "
26012601
"[pandas] in your system's mysql default file, "
26022602
"typically located at ~/.my.cnf or /etc/.my.cnf."
2603-
)
2604-
except pymysql.Error:
2603+
) from err
2604+
except pymysql.Error as err:
26052605
raise RuntimeError(
26062606
"Cannot connect to database. "
26072607
"Create a group of connection parameters under the heading "
26082608
"[pandas] in your system's mysql default file, "
26092609
"typically located at ~/.my.cnf or /etc/.my.cnf."
2610-
)
2610+
) from err
26112611

26122612
self.method = request.function
26132613

pandas/tests/reshape/merge/test_join.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -810,23 +810,23 @@ def _check_join(left, right, result, join_col, how="left", lsuffix="_x", rsuffix
810810

811811
try:
812812
lgroup = left_grouped.get_group(group_key)
813-
except KeyError:
813+
except KeyError as err:
814814
if how in ("left", "inner"):
815815
raise AssertionError(
816816
f"key {group_key} should not have been in the join"
817-
)
817+
) from err
818818

819819
_assert_all_na(l_joined, left.columns, join_col)
820820
else:
821821
_assert_same_contents(l_joined, lgroup)
822822

823823
try:
824824
rgroup = right_grouped.get_group(group_key)
825-
except KeyError:
825+
except KeyError as err:
826826
if how in ("right", "inner"):
827827
raise AssertionError(
828828
f"key {group_key} should not have been in the join"
829-
)
829+
) from err
830830

831831
_assert_all_na(r_joined, right.columns, join_col)
832832
else:

pandas/tests/reshape/test_concat.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1849,8 +1849,8 @@ def __len__(self) -> int:
18491849
def __getitem__(self, index):
18501850
try:
18511851
return {0: df1, 1: df2}[index]
1852-
except KeyError:
1853-
raise IndexError
1852+
except KeyError as err:
1853+
raise IndexError from err
18541854

18551855
tm.assert_frame_equal(pd.concat(CustomIterator1(), ignore_index=True), expected)
18561856

pandas/tests/tseries/offsets/common.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ def assert_offset_equal(offset, base, expected):
1111
assert actual == expected
1212
assert actual_swapped == expected
1313
assert actual_apply == expected
14-
except AssertionError:
14+
except AssertionError as err:
1515
raise AssertionError(
1616
f"\nExpected: {expected}\nActual: {actual}\nFor Offset: {offset})"
1717
f"\nAt Date: {base}"
18-
)
18+
) from err
1919

2020

2121
def assert_is_on_offset(offset, date, expected):

pandas/tseries/frequencies.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ def to_offset(freq) -> Optional[DateOffset]:
141141
delta = offset
142142
else:
143143
delta = delta + offset
144-
except ValueError:
145-
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(freq))
144+
except ValueError as err:
145+
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(freq)) from err
146146

147147
else:
148148
delta = None
@@ -173,8 +173,8 @@ def to_offset(freq) -> Optional[DateOffset]:
173173
delta = offset
174174
else:
175175
delta = delta + offset
176-
except (ValueError, TypeError):
177-
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(freq))
176+
except (ValueError, TypeError) as err:
177+
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(freq)) from err
178178

179179
if delta is None:
180180
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(freq))
@@ -223,9 +223,9 @@ def _get_offset(name: str) -> DateOffset:
223223
# handles case where there's no suffix (and will TypeError if too
224224
# many '-')
225225
offset = klass._from_name(*split[1:])
226-
except (ValueError, TypeError, KeyError):
226+
except (ValueError, TypeError, KeyError) as err:
227227
# bad prefix or suffix
228-
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(name))
228+
raise ValueError(libfreqs.INVALID_FREQ_ERR_MSG.format(name)) from err
229229
# cache
230230
_offset_map[name] = offset
231231

pandas/tseries/offsets.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2530,12 +2530,12 @@ def _tick_comp(op):
25302530
def f(self, other):
25312531
try:
25322532
return op(self.delta, other.delta)
2533-
except AttributeError:
2533+
except AttributeError as err:
25342534
# comparing with a non-Tick object
25352535
raise TypeError(
25362536
f"Invalid comparison between {type(self).__name__} "
25372537
f"and {type(other).__name__}"
2538-
)
2538+
) from err
25392539

25402540
f.__name__ = f"__{op.__name__}__"
25412541
return f
@@ -2570,10 +2570,10 @@ def __add__(self, other):
25702570
return self.apply(other)
25712571
except ApplyTypeError:
25722572
return NotImplemented
2573-
except OverflowError:
2573+
except OverflowError as err:
25742574
raise OverflowError(
25752575
f"the add operation between {self} and {other} will overflow"
2576-
)
2576+
) from err
25772577

25782578
def __eq__(self, other: Any) -> bool:
25792579
if isinstance(other, str):

pandas/util/_tester.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
def test(extra_args=None):
1111
try:
1212
import pytest
13-
except ImportError:
14-
raise ImportError("Need pytest>=5.0.1 to run tests")
13+
except ImportError as err:
14+
raise ImportError("Need pytest>=5.0.1 to run tests") from err
1515
try:
1616
import hypothesis # noqa
17-
except ImportError:
18-
raise ImportError("Need hypothesis>=3.58 to run tests")
17+
except ImportError as err:
18+
raise ImportError("Need hypothesis>=3.58 to run tests") from err
1919
cmd = ["--skip-slow", "--skip-network", "--skip-db"]
2020
if extra_args:
2121
if not isinstance(extra_args, list):

0 commit comments

Comments
 (0)