Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:129318 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by lists.php.net (Postfix) with ESMTPS id BB51F1A00BC for ; Thu, 20 Nov 2025 00:11:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1763597480; bh=L4VMyF6lx6ZrEPTioaONptlqtk9c6ss+cx5TiHUe4ik=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=lyRfYkF5CJmZnfumH3YD6FKe1BrYzAi/1jQl62sUWepnREHZUC6UkIA5nUHO28Ih/ U5flKPT5Kc36YD7MJq1zgJvs8ovyoJUsDZ6zMmvEFkhU6i/jtShOmoKobYq3+Q1Zo2 MXmfcsAdyf/co2qW+1BoooWVGr43oeHv6dZhV9XVJgSdO1GPODnlmTTN3WcpwlAK+u sZ2YFcAOGgoBQmUuiRBQ45l4Jp05Fxmyg3kBgZabv+Efk7lEhzzU5OPqORhJRQc95e 4flFRxWSvR3F5ctcdLIfjz0dkZy59e2TxHq+wHtsbgBo9xS+FdQ+eekzMzgVbh4jR1 rA+xGX0/ZT3gA== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 5CC381801DA for ; Thu, 20 Nov 2025 00:11:15 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_20, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: No X-Envelope-From: Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazolkn19010017.outbound.protection.outlook.com [52.103.32.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (secp384r1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Thu, 20 Nov 2025 00:11:14 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LhqzSI4UjZQR83DaMcRVxZngjeYc0HUx5VCRAXwQc6ievYCn0Hh0hHni7PnqFXnrCAR8+dFUYlo01U7+82bD3UXhQHssGQNOq9+JOudD2qY429F4eHImV2KUgguCDuzlvgAEt/9FAbaQfQg70J+nCLabwg17LXgUKKxzT66RHhgCKD11ckcKNjTcJ0guzFDl+QisdMuyzOZRMV2Wm4OvvKeOvhA7H2cb6T7HWGDlzZOwScyHFn2uSj6v56S6H1+Twd+hP+hZH54tAu0MNCZSHyOMa0bHd9++cCS4BCoYvhXO6NkCsD/i3N5/ABKSpga6POt5JwnnHdjTAEYdeQhuGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=vBIjQeWHzytdRrLclkKh3xd41IPEKwze9foy2lLJorg=; b=Shi86DD+4utP7llBTD7IDmFPkwQjxhYDvUgFUoomaNyF4mnWRdm3jRMaXgRmwgouyEi0B/z31Cjd2SppE7nJHAoah1FfzhcVA5GcVISyusFr0xfSMNEF/2mY5tVfV4OpxP3fydobn2HFAZ23M0cdlbD6wSjaE3aUOhfvh2tOzcjSaVc0yWlg6AHqZCz4oDXyzsBaRD4YwUJSwX0E1mvkNwsPEW4M13vP0chrxlQV6G/MT0/uQGZ9/wQrLGYl/3e5r/iU96VShGYWADwsw4evNFGCMe5z01wSTGb+C9yZLRNimjivrKqqvBDZef3iAgBWiNMSlNv04Nvxbd8f6RXwuQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vBIjQeWHzytdRrLclkKh3xd41IPEKwze9foy2lLJorg=; b=BMYVndT2CSCV0rB3dbN4cK6Fe0qBhZVMdHQU9Gst1SsBqMd5H3fJvLWcSnrI19qF5kJeOu+U/qxSryQ3yuoF9xBZuOrbYDeOvTqmQ9iBqjUPblE2nKHm2mA8jVfcNaaeGrRyBd1CrV7wJSEoIMwQasVVEuQs/fPNvgvx00rTGSwWeq9cMl1txVAph0/+eUWa9tcGNGVWYp9qwAVJ23ZJBpyc7bPM5J8AH98YI5K+aMyuJZAuL4qqrHKt1Dw+7L/pImmUcBZWJnOuBjrbsRVKj2Yp3byEQJEvH0/IcVx9JNZK3BhmK+wqoTltJNTmDEwYHOqEoQfnOj3u6w+IrQDjVw== Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) by DU2PPF619620E44.EURP250.PROD.OUTLOOK.COM (2603:10a6:18:3::b17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.10; Thu, 20 Nov 2025 00:11:07 +0000 Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::651e:bbd2:b18a:80ff]) by AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::651e:bbd2:b18a:80ff%3]) with mapi id 15.20.9320.013; Thu, 20 Nov 2025 00:11:07 +0000 Content-Type: multipart/alternative; boundary="------------Llj1gKza5Qih8TAot0fQBQfG" Message-ID: Date: Thu, 20 Nov 2025 01:11:05 +0100 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] [RFC] Stream Error Handling Improvements To: Jakub Zelenka Cc: PHP internals list References: Content-Language: en-US In-Reply-To: X-ClientProxiedBy: AM0PR10CA0058.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::38) To AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) X-Microsoft-Original-Message-ID: Precedence: list list-help: list-unsubscribe: list-post: List-Id: x-ms-reactions: disallow MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM8P250MB0170:EE_|DU2PPF619620E44:EE_ X-MS-Office365-Filtering-Correlation-Id: c2afb971-f3fa-4089-1998-08de27c94d2d X-MS-Exchange-SLBlob-MailProps: 9IecXKUgicCO8OP9JSHQ+xjWRIebUMjRbJUvapYNmxbm5vU2JthxwE2/ATEbp+4TttGxidBtGfUt2+RJVUFJFIHmRpzHWMhnihglZv+/Al1JogFJUJMtYC0CyptnB7ETZySenXz53lV5T1w8dik5MmCQZqcoo9r552gk4s7t84hIyewtztNeNXHJjlBA1/LQO6P7NK+Hb67TebwQShUoHXPPWifavx/IgGgmw4kSQhkCgnPrniu5Kc5nbXMzTwXLYJ5ndcTGQgY/5aOTuU0fKfiDbaZXMQHFlfvMaRIT7948cQnVUIL7EWyDAPaVWDDURN8NLWfIehPp8ccVt55s2L5wE//pD+7JoxJMVDP3ro2DPoRMiEIMyScGu/SDS8vKuZz/xSqGCbfop9IwEH5AeBp17MP7MICxlLVsREnhknOqO7l177iq7rgPyyg55v3jFfVrRllX49gJ9qqP7BwKIwpgZWlOzRCw9S9SLfvRG1xPKRpm/LwcKj39MArhJqJA0Au943TWYebSE93KNHBB3STZ/H0MNbLqiJZf3kp6Rh66IvY6EGq/7jpXsNlHvo9CCPJU6Wu2nlRqRHPc59BWmBzdznyaCYeDu18ALzwet4o/NeB1c/MsZrAAvbz7zAkJKl7Q+hXpm/uQa0IvF+tW+Z+PwAP/eeqIsZQ4KJRiMt5abFoM9oVLUxMdBBUQ+Bjuh1phQFktY0za8Q0KPyJ5gIY4Sx6wGtTamtZLtHrP7IxGMeyM03k/+A== X-Microsoft-Antispam: BCL:0;ARA:14566002|51005399006|12121999013|8060799015|19110799012|5072599009|23021999003|15080799012|12050799012|461199028|40105399003|3412199025|440099028|26104999006; X-Microsoft-Antispam-Message-Info: =?utf-8?B?VzZpWEhhZW9VZWFCZVc4SkdmYlV6bHlCMzNTWXl1MHRvdDJLOFFuN2Evam43?= =?utf-8?B?TzZXZXR2ZDA5dUdUeHVpaFV1QTNPYXRBWm10aml4cE9hTU5wTElTVitLckV1?= =?utf-8?B?TUdpUHZ5SVFuL3I0NkhnSkY3SGJ5ZWRGQ2N2ZWRSejFLVnE2MlJCSDJ4ZXFD?= =?utf-8?B?SWtWNmJvYXY3cHhwRjkrSmxmRkdPQmRxZ3NKcENtV21SQW1qbGFLZlJHWDZC?= =?utf-8?B?UVI1ZmcyL25aTHJUSTRZTjcybXBYUUdWWHV5RnVwNm5uVG53ZTFCd2xFbEN0?= =?utf-8?B?QWt0V3l1WW8vclYyTXgwSG1FT2JQbWt2TytXdmdxOXl4MlNmby83bEVtMUhM?= =?utf-8?B?TmI2NGpIekpXNXU1aXJ0QmF4Qk1QUDNFTktOOTMrYUdFanZiRk9mTFAvblAz?= =?utf-8?B?OHQyVDc2VXJ0MERJVVdGQnF0MzVVWHp2Y25Sc0lUSWtTRXNIUUVhTVQzYVNv?= =?utf-8?B?bkZybnVwS0tPN0xUSXhGd1FjS2toZ3FMVW5reWxqQW8wc2dlNHgraHlmZU11?= =?utf-8?B?b2oxNVU2UElFVXdSU0tTQkt4Y2JESXhrTW9aSEc5WlRHZk9TLzRxeHIxVUxO?= =?utf-8?B?SFVBTTJOWUswaGQxSUE2SkhMZFRiakdLOTZhNGxFeU0rNlFyOFFnUFE2OFFY?= =?utf-8?B?b0xqRXZDZERiQTJnOWVnVHk5QklsVzNyaGFwemlPSFpVRktBWmliR1FkY1RZ?= =?utf-8?B?U3RVekpSSTVUUVlSTmF5Ynp5ZGh5VE1zUURveTJtS1IwWmpYTWR6OU5wUnpL?= =?utf-8?B?c0sva09HZng0OTN3cGJYMFhYK014eFRuc3dkeFZMRlFPMno2MDlJd2M4alJx?= =?utf-8?B?Zm9jdlNVZnMrSDNsVjZnbGpMTFN2b29ubDluQUFzQUFNM3ZFSE9NNkFnQ09B?= =?utf-8?B?R05BS3ZrdmpMMXBNN3lldnRNZHB3VEQwYW5sZDRiSWo4WXJ4UmwrM0dLZUtw?= =?utf-8?B?WmU3UHM1bkNqcytYMG1pclQ2bTA4QUFMeCt2MkFZdzRHQWhzNlVMTDFUYXNa?= =?utf-8?B?MWZhR0tqd3hjR0lsbHB3a1FTRXEvcjVES3BaVzIvRndxak5XcnBBRWtlUFB0?= =?utf-8?B?R1Y1czlibnlxL3d3ZnN1cHFudDNVWDlkbGpxYmM3dFIzSHo2T3BaVkhvbGJU?= =?utf-8?B?K1dQdWVRbGdCc1VuazBCbjl3WmhvNERRL3RWYTA0c09IbU42S25IeFBSb2xQ?= =?utf-8?B?WnVmbXlSSFJnZEZiNzlzWEVlN2FBaUpSM3JkNWZyNk9RZVJiWW56Mml4NkIr?= =?utf-8?B?aUdDZTMzcHJLYkVncGxiYlhKa2ZheXJyY1RaMUl1U1p2VE5OMGlHTnkwV01P?= =?utf-8?B?VkhwZldtV243Ykt4bGJPOXNpQjhqZjliL0tzN1VIOEVUdmNUb1dpQkFNdlZw?= =?utf-8?B?cVp5aHczMm9hT3doL2lCQU4wU2xWOUUwTmhwdStQUnlocndzdS93dzRTM1hs?= =?utf-8?B?U0cvM0ZQSVZGK1lUUkd5VGN0cFVjZFpMY2FaSE5tMENHemJ1QTg1MXhhR3JD?= =?utf-8?B?eHprNDJMSndubWpPVm1VeDhaTm5PUSs1M00rQnRucHB1d29JV253WTJnUm1t?= =?utf-8?B?ZHN5OHFtdi96cURhZmFDQi9vRU1pTlNpVEhhWlhjZHlOVmVPZmNMa1BlVERS?= =?utf-8?B?ZHF0ZHpUQW0yWk92cXlvMHNSb2RORHRYZ25ncTlmQjNmeHJBRDMzNFBRTmRX?= =?utf-8?B?dWlVck5PZi9EcUNUaVRJRUVzd3dxczBnZ3l5c3hyWEdraExlTkpFWHNRPT0=?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TlEyNHZmMnQ0OE5pdlAwOUFTYjRucnlBdi9xcDVmRXhkL3dKdFZvMGhrWWhD?= =?utf-8?B?U3dYVk1oR0ZVMTkzL1AyTDhPVDMwN1U3RnFxL0U2aUVsMWM1RjFPTFNGc3ZE?= =?utf-8?B?Q2dsSnFOWDVFZzFpbXZxcFJZZkZ5VzJUNExubFpOU0FacndhT2YwNlpQMXlN?= =?utf-8?B?NEdZZmNtY3FCNjB0cFdMVnE4Sk4yMGlzaGxWek43a2hvSFh6bDNjUWNqUGg1?= =?utf-8?B?RWRObEthenFlRUlLNjhDUk9IYnZyaEVyS2w3YXNoWlF2RnZVMDkweW1nZzRR?= =?utf-8?B?QzVmZFB3QUdvMGdyaGJVeGViTlZMRnlzcjg5TVpuY1R5Y1Z0MXZsbmlBcnU4?= =?utf-8?B?U1Q1U2xweTRYNzUyRjNxUGFZU3JYakxkTmZweXpWSk1aeEpBQ3pVN0RPV3Jo?= =?utf-8?B?TnY5ZmlTcXlFTDgyR1lTbHl2eEVOa3kveG03cTh4bmhtU3NQUERQNGwva3VW?= =?utf-8?B?ekI4UUROTE9OZlVPSXRpYXhMUXJOWS94OVFoSU9mTVl5cWVCS2lWTUxDR3Bv?= =?utf-8?B?WE5iVXlGeURwSXhSQWFWYkc2WmNicVcxWTQ5N1hyZzEwT2l3UXBHRFpCU2VX?= =?utf-8?B?eDhZeVArblc1c0NBVXZoWHNFRlE5WDh4ZjNlYlVMcUJmVlhBdkJTSzhQR01u?= =?utf-8?B?TENmYXFady8zMGdwV0RSblFMNDZOc2Z0TUJpVU8rakdST2UzTklwOE8rT2tw?= =?utf-8?B?S3dzVUxXOVEwcFpRd3VIbmxFUWY4WlpGaEtXNUhCd3d4Zjc0NktNTmRaczhV?= =?utf-8?B?bElHRUJucU55MEZ1a3RtenNoVUdtU0Fzb1ZDeUZ1NnRHVmlVd0RXcjUvQmF5?= =?utf-8?B?OC9qcWF5dkpYajZsVHdUS1piZWFXSnhhZnk5eVhNT0Y0SHc2YWZMZmFGMHI0?= =?utf-8?B?QVN4S0haVUwzSGcvdDM4SlQ3RDFDbzFrMHNuRkVJTGEzU1UvaGY3UlNFWVMz?= =?utf-8?B?NzJuU1puUGovRUFGQmIxYXRPRFJGODlxVWFqOTFjU0FOUmpWTlRQc1Y4SHUr?= =?utf-8?B?T1ZYUVJlQ3lEL01tMCs2dW82cmkrb3RzTUdMcXJzOENJYU03YlVrYmRLMU9X?= =?utf-8?B?Y1UrKzJHRlY0MzBJZU1SKzIydzVBcUhGZVJFaHNZUDhmZFQwemhsSWJwaEcx?= =?utf-8?B?dWIvMjRYNzQzUFdBWEl0Nnc4UWxZc3g3dkxCNGJsQzZweUk0a1BmYzBLcGs0?= =?utf-8?B?bWR4ZUhRbzR1QkRrT2FGUURpWEJjdE54WXV1SDRiSk5YeWxXeTh6ZWdLQkJI?= =?utf-8?B?STZ5S1A1ME45NE82ZnlyUDZNQno4azJOVHlhYUF1NVlkOGhCQi8xN1dGcjly?= =?utf-8?B?RWMrblZVd3lMeGFLMDlMbEEvVU5uL01MZVZ6VmQ4UUJOWmdHbWZzRUtDYzY0?= =?utf-8?B?WmFhSjducDQ3ZTFXZzhmUEl3TjQrRjVWV0NGQ01kRTJIbUthUU1tSU1SMzBQ?= =?utf-8?B?aEpaUXpmWEduU2ZOOUlFckgvT25BKzZLTWJoeU4rZTBEa0szWG1oQloyR0NC?= =?utf-8?B?cEFRRlF6NWdlTkUvVFM4TW42bVpPWHBrOEpINmdrK0ZJdlBBdDhKeEpJZWxL?= =?utf-8?B?VzJxcmIxTzBJMXYzTXh4WldlNUVFVmxYY09NVlY2aEYweXZqM0tLMVhGTnIr?= =?utf-8?B?Z1pVMiszNG96WldlZ1E1Q01XOWg0bzk4bnc5Z3dsU2tvOGMrSVpINFFBbnVq?= =?utf-8?B?ZmVOU3VvK05PdHFENDRVV08vbzFFZWRuK2tqU0IwWkFaSnF1TThSRURKYTB4?= =?utf-8?Q?UplhWnQ7C8B0qbEz+I=3D?= X-OriginatorOrg: sct-15-20-8534-15-msonline-outlook-5f066.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: c2afb971-f3fa-4089-1998-08de27c94d2d X-MS-Exchange-CrossTenant-AuthSource: AM8P250MB0170.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2025 00:11:07.5091 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU2PPF619620E44 From: bobwei9@hotmail.com (Bob Weinand) --------------Llj1gKza5Qih8TAot0fQBQfG Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hey Jakub, On 19.11.2025 23:58:57, Jakub Zelenka wrote: > On Wed, Nov 19, 2025 at 5:37 PM Bob Weinand wrote: > > On 19.11.2025 12:52:35, Jakub Zelenka wrote: >> The code one should be probably named StreamErrorCode (to not >> interact with what Jordi proposed) and think it will need to be >> backed as there should be a straightforward way how to compare it >> with exception code. I might need to extend the gen stub as I'm >> not sure it allows macro import for enum value like for constants >> or I will need to come up with some mapping. I just don't wan to >> duplicate the numbers. I will figure something out. > > How important is it to have exception code? > > I think the exception code could be quite useful for checking for > specific errors. It's much better than trying to match it by error > message which I saw in past used in normal error handlers. So I can > see definitely use case for that. It might be also possible to group > those erors if enums are used so users could just match specific group > of errors. For the purpose of grouping it would be vastly preferable to add functions to the enum class to mark enum values as pertaining to specific groups "function isIoError(): bool", "function isFileSystemError(): bool" etc. or just simply "function errorGroup(): StreamErrorGroup" which is another enum with some grooups like "Io", "Filesystem" etc. rather than comparing ranges. > I found that for our purposes we generally skip the exception code > (i.e. keep it at zero). > As a simple example, ErrorException does take two integers - one > for severity, and one for code, instead of using the severity as code. > > Severity is almost always warning which I don't think is a good > representation for code. I saw error codes used in various application > and I think they are useful. I don't think it hurts to have them. The > implementation of that enum should not be a big problem. I just need > to figure out how to make it nice. > > I would propose something similar here: call it StreamError and > provide a public $error property for the actual enum, rather than > squeezing it into $code. > > I'm not sure I understand this. The code is a generic identifier for > the error class that can be matched. StreamError would be the actual > representation containing the message and other info - this cannot be > matched in a generic way. My point here is that $code generally does not get used for our Exceptions. Whenever we need to attach extra information to an exception, we do it as extraneous properties. (That's what my example with ErrorException was about.) I.e. ignore the existence of $code (just assign zero). And add an extra property for the StreamError enum (which now needs no backing). class StreamException extends Exception {     public __construct(         public StreamError $error,         public string $wrapperName,         string $message = "",         public string|null $param = "",         ?Throwable $previous = null     ) {         parent::__construct($message, 0, $previous);     } } Does this make more sense, described as code? Thank you, Bob --------------Llj1gKza5Qih8TAot0fQBQfG Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hey Jakub,

On 19.11.2025 23:58:57, Jakub Zelenka wrote:
On Wed, Nov 19, 2025 at 5:37 PM Bob Weinand <bobwei9@hotmail.com> wrote:
On 19.11.2025 12:52:35, Jakub Zelenka wrote:
The code one should be probably named StreamErrorCode (to not interact with what Jordi proposed) and think it will need to be backed as there should be a straightforward way how to compare it with exception code. I might need to extend the gen stub as I'm not sure it allows macro import for enum value like for constants or I will need to come up with some mapping. I just don't wan to duplicate the numbers. I will figure something out.

How important is it to have exception code?

I think the exception code could be quite useful for checking for specific errors. It's much better than trying to match it by error message which I saw in past used in normal error handlers. So I can see definitely use case for that. It might be also possible to group those erors if enums are used so users could just match specific group of errors.

For the purpose of grouping it would be vastly preferable to add functions to the enum class to mark enum values as pertaining to specific groups "function isIoError(): bool", "function isFileSystemError(): bool" etc. or just simply "function errorGroup(): StreamErrorGroup" which is another enum with some grooups like "Io", "Filesystem" etc. rather than comparing ranges.


I found that for our purposes we generally skip the exception code (i.e. keep it at zero).
As a simple example, ErrorException does take two integers - one for severity, and one for code, instead of using the severity as code.

Severity is almost always warning which I don't think is a good representation for code. I saw error codes used in various application and I think they are useful. I don't think it hurts to have them. The implementation of that enum should not be a big problem. I just need to figure out how to make it nice.

I would propose something similar here: call it StreamError and provide a public $error property for the actual enum, rather than squeezing it into $code.

I'm not sure I understand this. The code is a generic identifier for the error class that can be matched. StreamError would be the actual representation containing the message and other info - this cannot be matched in a generic way.


My point here is that $code generally does not get used for our Exceptions. Whenever we need to attach extra information to an exception, we do it as extraneous properties. (That's what my example with ErrorException was about.)

I.e. ignore the existence of $code (just assign zero).

And add an extra property for the StreamError enum (which now needs no backing).

class StreamException extends Exception {
    public __construct(
        public StreamError $error,
        public string $wrapperName,
        string $message = "",
        public string|null $param = "",
        ?Throwable $previous = null
    ) {
        parent::__construct($message, 0, $previous);
    }
}

Does this make more sense, described as code?


Thank you,
Bob

--------------Llj1gKza5Qih8TAot0fQBQfG--