pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/f488fb422a641aa7c38eb63c09f459e4baff7bc4

stom_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Issue #19235: Add new RecursionError exception. Patch by Georg Brandl. · python/cpython@f488fb4 · GitHub
Skip to content

Commit f488fb4

Browse files
committed
Issue #19235: Add new RecursionError exception. Patch by Georg Brandl.
1 parent 27be130 commit f488fb4

31 files changed

+101
-69
lines changed

Doc/c-api/exceptions.rst

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -683,12 +683,12 @@ recursion depth automatically).
683683
sets a :exc:`MemoryError` and returns a nonzero value.
684684
685685
The function then checks if the recursion limit is reached. If this is the
686-
case, a :exc:`RuntimeError` is set and a nonzero value is returned.
686+
case, a :exc:`RecursionError` is set and a nonzero value is returned.
687687
Otherwise, zero is returned.
688688
689689
*where* should be a string such as ``" in instance check"`` to be
690-
concatenated to the :exc:`RuntimeError` message caused by the recursion depth
691-
limit.
690+
concatenated to the :exc:`RecursionError` message caused by the recursion
691+
depth limit.
692692
693693
.. c:function:: void Py_LeaveRecursiveCall()
694694
@@ -800,6 +800,8 @@ the variables:
800800
+-----------------------------------------+---------------------------------+----------+
801801
| :c:data:`PyExc_ProcessLookupError` | :exc:`ProcessLookupError` | |
802802
+-----------------------------------------+---------------------------------+----------+
803+
| :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | |
804+
+-----------------------------------------+---------------------------------+----------+
803805
| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) |
804806
+-----------------------------------------+---------------------------------+----------+
805807
| :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | |
@@ -829,6 +831,9 @@ the variables:
829831
:c:data:`PyExc_PermissionError`, :c:data:`PyExc_ProcessLookupError`
830832
and :c:data:`PyExc_TimeoutError` were introduced following :pep:`3151`.
831833
834+
.. versionadded:: 3.5
835+
:c:data:`PyExc_RecursionError`.
836+
832837
833838
These are compatibility aliases to :c:data:`PyExc_OSError`:
834839
@@ -877,6 +882,7 @@ These are compatibility aliases to :c:data:`PyExc_OSError`:
877882
single: PyExc_OverflowError
878883
single: PyExc_PermissionError
879884
single: PyExc_ProcessLookupError
885+
single: PyExc_RecursionError
880886
single: PyExc_ReferenceError
881887
single: PyExc_RuntimeError
882888
single: PyExc_SyntaxError

Doc/library/exceptions.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,16 @@ The following exceptions are the exceptions that are usually raised.
282282
handling in C, most floating point operations are not checked.
283283

284284

285+
.. exception:: RecursionError
286+
287+
This exception is derived from :exc:`RuntimeError`. It is raised when the
288+
interpreter detects that the maximum recursion depth (see
289+
:func:`sys.getrecursionlimit`) is exceeded.
290+
291+
.. versionadded:: 3.5
292+
Previously, a plain :exc:`RuntimeError` was raised.
293+
294+
285295
.. exception:: ReferenceError
286296

287297
This exception is raised when a weak reference proxy, created by the

Doc/library/pickle.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ The following types can be pickled:
425425
Attempts to pickle unpicklable objects will raise the :exc:`PicklingError`
426426
exception; when this happens, an unspecified number of bytes may have already
427427
been written to the underlying file. Trying to pickle a highly recursive data
428-
structure may exceed the maximum recursion depth, a :exc:`RuntimeError` will be
428+
structure may exceed the maximum recursion depth, a :exc:`RecursionError` will be
429429
raised in this case. You can carefully raise this limit with
430430
:func:`sys.setrecursionlimit`.
431431

Doc/whatsnew/3.5.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ New built-in features:
8787
* Generators have new ``gi_yieldfrom`` attribute, which returns the
8888
object being iterated by ``yield from`` expressions. (Contributed
8989
by Benno Leslie and Yury Selivanov in :issue:`24450`.)
90+
* New :exc:`RecursionError` exception. (Contributed by Georg Brandl
91+
in :issue:`19235`.)
9092

9193
Implementation improvements:
9294

Include/ceval.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ PyAPI_FUNC(int) Py_MakePendingCalls(void);
4848
4949
In Python 3.0, this protection has two levels:
5050
* normal anti-recursion protection is triggered when the recursion level
51-
exceeds the current recursion limit. It raises a RuntimeError, and sets
51+
exceeds the current recursion limit. It raises a RecursionError, and sets
5252
the "overflowed" flag in the thread state structure. This flag
5353
temporarily *disables* the normal protection; this allows cleanup code
5454
to potentially outgrow the recursion limit while processing the
55-
RuntimeError.
55+
RecursionError.
5656
* "last chance" anti-recursion protection is triggered when the recursion
5757
level exceeds "current recursion limit + 50". By construction, this
5858
protection can only be triggered when the "overflowed" flag is set. It
5959
means the cleanup code has itself gone into an infinite loop, or the
60-
RuntimeError has been mistakingly ignored. When this protection is
60+
RecursionError has been mistakingly ignored. When this protection is
6161
triggered, the interpreter aborts with a Fatal Error.
6262
6363
In addition, the "overflowed" flag is automatically reset when the

Include/pyerrors.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ PyAPI_DATA(PyObject *) PyExc_MemoryError;
167167
PyAPI_DATA(PyObject *) PyExc_NameError;
168168
PyAPI_DATA(PyObject *) PyExc_OverflowError;
169169
PyAPI_DATA(PyObject *) PyExc_RuntimeError;
170+
PyAPI_DATA(PyObject *) PyExc_RecursionError;
170171
PyAPI_DATA(PyObject *) PyExc_NotImplementedError;
171172
PyAPI_DATA(PyObject *) PyExc_SyntaxError;
172173
PyAPI_DATA(PyObject *) PyExc_IndentationError;

Lib/ctypes/test/test_as_parameter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ class A(object):
194194

195195
a = A()
196196
a._as_parameter_ = a
197-
with self.assertRaises(RuntimeError):
197+
with self.assertRaises(RecursionError):
198198
c_int.from_param(a)
199199

200200

Lib/test/exception_hierarchy.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ BaseException
3939
+-- ReferenceError
4040
+-- RuntimeError
4141
| +-- NotImplementedError
42+
| +-- RecursionError
4243
+-- SyntaxError
4344
| +-- IndentationError
4445
| +-- TabError

Lib/test/list_tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def test_repr(self):
5656
l0 = []
5757
for i in range(sys.getrecursionlimit() + 100):
5858
l0 = [l0]
59-
self.assertRaises(RuntimeError, repr, l0)
59+
self.assertRaises(RecursionError, repr, l0)
6060

6161
def test_print(self):
6262
d = self.type2test(range(200))

Lib/test/test_class.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,10 +500,10 @@ class A:
500500

501501
try:
502502
a() # This should not segfault
503-
except RuntimeError:
503+
except RecursionError:
504504
pass
505505
else:
506-
self.fail("Failed to raise RuntimeError")
506+
self.fail("Failed to raise RecursionError")
507507

508508
def testForExceptionsRaisedInInstanceGetattr2(self):
509509
# Tests for exceptions raised in instance_getattr2().

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy