{"id":1439,"date":"2026-01-29T09:41:05","date_gmt":"2026-01-29T08:41:05","guid":{"rendered":"https:\/\/ahassan.inscastellbisbal.net\/?page_id=1439"},"modified":"2026-01-29T10:38:12","modified_gmt":"2026-01-29T09:38:12","slug":"depuracio-del-codi-de-python","status":"publish","type":"page","link":"https:\/\/ahassan.inscastellbisbal.net\/?page_id=1439","title":{"rendered":"Depuraci\u00f3 del codi de Python"},"content":{"rendered":"\n<p>La depuraci\u00f3 (o <em>debugging<\/em>) no \u00e9s nom\u00e9s l&#8217;acte de &#8220;arreglar el que est\u00e0 trencat&#8221;. En un entorn de producci\u00f3, \u00e9s una <strong>estrat\u00e8gia de defensa<\/strong> i una pe\u00e7a clau de l&#8217;experi\u00e8ncia d&#8217;usuari (UX). Un programa que falla sense explicaci\u00f3 perd la confian\u00e7a de l&#8217;usuari; un programa que no valida entrades \u00e9s una porta oberta a atacants.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. La Depuraci\u00f3 com a pilar de Seguretat i UX<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Seguretat: El perill de la confian\u00e7a<\/h3>\n\n\n\n<p>Si no depurem i validem, el sistema pot ser vulnerable a injeccions de codi o desbordaments de mem\u00f2ria. La depuraci\u00f3 permet identificar on el codi \u00e9s &#8220;fr\u00e0gil&#8221; davant d&#8217;entrades inesperades que un atacant podria aprofitar per saltar-se la l\u00f2gica de negoci.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">UX: La fallida silenciosa vs. la fallida graciosa<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Crash (Mala UX):<\/strong> L&#8217;usuari prem un bot\u00f3, l&#8217;aplicaci\u00f3 es tanca o mostra un error <code>500 Internal Server Error<\/code>. L&#8217;usuari se sent frustrat i perd les dades no guardades.<\/li>\n\n\n\n<li><strong>Gesti\u00f3 d&#8217;errors (Bona UX):<\/strong> El sistema detecta l&#8217;error, l&#8217;atura abans que bloquegi el servidor i mostra un missatge amable: <em>&#8220;Sembla que el format del DNI no \u00e9s correcte, si us plau, revisa-ho&#8221;<\/em>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Validaci\u00f3 d&#8217;Entrades i Integritat de Dades<\/h2>\n\n\n\n<p>Validar dades com el <strong>DNI<\/strong> o el <strong>Correu Electr\u00f2nic<\/strong> no \u00e9s nom\u00e9s per est\u00e8tica, sin\u00f3 per garantir la <strong>integritat referencial<\/strong>:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Evitar el &#8220;Garbage In, Garbage Out&#8221;:<\/strong> Si guardem un DNI malament, mai podrem vincular correctament les tasques d&#8217;aquell usuari en el futur.<\/li>\n\n\n\n<li><strong>Consist\u00e8ncia:<\/strong> El format <code>12345678Z<\/code> ha de ser universal en tota la base de dades per permetre cerques i \u00edndexs eficients.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Implementaci\u00f3 en Python<\/h2>\n\n\n\n<p>A continuaci\u00f3, presento un exemple d&#8217;un m\u00f2dul de registre d&#8217;usuaris que utilitza blocs <code>try-except<\/code>, validacions amb expressions regulars (Regex) i un sistema de logs professional.<\/p>\n\n\n\n<p>Python<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import re\nimport logging\n\n# Configuraci\u00f3 del sistema de logs per rastrejar errors complexos\nlogging.basicConfig(\n    level=logging.INFO,\n    format='%(asctime)s - %(levelname)s - %(message)s',\n    handlers=&#91;\n        logging.FileHandler(\"app_errors.log\"), # Desa els errors en un fitxer\n        logging.StreamHandler()                # Tamb\u00e9 els mostra per terminal\n    ]\n)\n\ndef validar_dni(dni):\n    \"\"\"Valida si un DNI t\u00e9 8 n\u00fameros i una lletra correcta.\"\"\"\n    lletres = \"TRWAGMYFPDXBNJZSQVHLCKE\"\n    if not re.match(r\"^\\d{8}&#91;A-Z]$\", dni):\n        return False\n    \n    # L\u00f2gica matem\u00e0tica del DNI\n    numero = int(dni&#91;:8])\n    lletra = dni&#91;8]\n    return lletres&#91;numero % 23] == lletra\n\ndef validar_email(email):\n    \"\"\"Valida el format d'un correu electr\u00f2nic.\"\"\"\n    regex = r'^&#91;a-z0-9]+&#91;\\._]?&#91;a-z0-9]+&#91;@]\\w+&#91;.]\\w{2,3}$'\n    return re.search(regex, email)\n\ndef processar_registre(dades_usuari):\n    \"\"\"Funci\u00f3 principal amb gesti\u00f3 d'errors.\"\"\"\n    try:\n        logging.info(f\"Intentant processar registre per: {dades_usuari.get('email')}\")\n        \n        # 1. Validaci\u00f3 de dades\n        email = dades_usuari.get('email')\n        dni = dades_usuari.get('dni')\n\n        if not validar_email(email):\n            raise ValueError(f\"Format de correu inv\u00e0lid: {email}\")\n        \n        if not validar_dni(dni):\n            raise ValueError(f\"DNI no v\u00e0lid o lletra incorrecta: {dni}\")\n\n        # Simulaci\u00f3 d'inserci\u00f3 a base de dades\n        logging.info(\"Usuari validat correctament. Guardant a la BD...\")\n        # Aqu\u00ed aniria la l\u00f2gica de la PK i FK comentada anteriorment\n        \n    except ValueError as ve:\n        # Errors controlats de validaci\u00f3 (UX)\n        logging.warning(f\"Error de validaci\u00f3: {ve}\")\n        return {\"status\": \"error\", \"message\": str(ve)}\n    \n    except Exception as e:\n        # Errors cr\u00edtics (Seguretat\/Sistema)\n        logging.error(f\"Error cr\u00edtic inesperat: {e}\", exc_info=True)\n        return {\"status\": \"error\", \"message\": \"S'ha produ\u00eft un error intern. Torni a intentar-ho m\u00e9s tard.\"}\n\n# --- CAS D'\u00daS ---\nusuari_exemple = {\"email\": \"alumne@codi.cat\", \"dni\": \"12345678Z\"}\nresultat = processar_registre(usuari_exemple)\nprint(resultat)\n<\/code><\/pre>\n\n\n\n<p>Vegem el proc\u00e9s de <strong>depuraci\u00f3<\/strong> de <strong>codi Python<\/strong> al <strong>Visual studio code<\/strong>.<\/p>\n\n\n\n<p>Primer necessitem un <strong>codi<\/strong>, aix\u00ed que demanarem a qualsevol <strong>IA<\/strong> (<strong>Intel\u00b7lig\u00e8ncia Artificial<\/strong>) el <strong>codi<\/strong> de <strong>depuraci\u00f3<\/strong>.Un cop tinguem el nostre <strong>codi<\/strong><\/p>\n\n\n\n<p><strong>Obriu<\/strong> el <strong>codi<\/strong> del <strong>Visual Studio<\/strong> i a la part <strong>superior<\/strong> <strong>esquerra<\/strong> hi haur\u00e0 l&#8217;opci\u00f3 d<strong>&#8216;obrir un fitxer nou.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"222\" height=\"509\" src=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-20-41-Diseno-sin-titulo-Presentacion.png\" alt=\"\" class=\"wp-image-1450\" srcset=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-20-41-Diseno-sin-titulo-Presentacion.png 222w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-20-41-Diseno-sin-titulo-Presentacion-131x300.png 131w\" sizes=\"auto, (max-width: 222px) 100vw, 222px\" \/><\/figure>\n\n\n\n<p>Despr\u00e9s d&#8217;obrir el fitxer, <strong>enganxeu<\/strong> el vostre <strong>codi<\/strong> de <strong>depuraci\u00f3<\/strong> al fitxer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-06-Diseno-sin-titulo-Presentacion-1024x576.png\" alt=\"\" class=\"wp-image-1451\" srcset=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-06-Diseno-sin-titulo-Presentacion-1024x576.png 1024w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-06-Diseno-sin-titulo-Presentacion-300x169.png 300w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-06-Diseno-sin-titulo-Presentacion-768x432.png 768w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-06-Diseno-sin-titulo-Presentacion.png 1143w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>despr\u00e9s d&#8217;enganxar el <strong>codi<\/strong> al fitxer <strong>superior<\/strong> <strong>inferior<\/strong> hi haur\u00e0 l&#8217;opci\u00f3 d&#8217;<strong>Executar<\/strong>(<strong>Run<\/strong>) el <strong>codi<\/strong>,Feu <strong>clic<\/strong> a la <strong>primera<\/strong> <strong>opci\u00f3<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"237\" height=\"374\" src=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-38-Diseno-sin-titulo-Presentacion.png\" alt=\"\" class=\"wp-image-1452\" srcset=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-38-Diseno-sin-titulo-Presentacion.png 237w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-21-38-Diseno-sin-titulo-Presentacion-190x300.png 190w\" sizes=\"auto, (max-width: 237px) 100vw, 237px\" \/><\/figure>\n\n\n\n<p>Despr\u00e9s d&#8217;aix\u00f2 ens demanen que <strong>seleccionem<\/strong> una <strong>opci\u00f3<\/strong> de les <strong>llibreria<\/strong> per <strong>depuracio<\/strong> del <strong>codi<\/strong>.farem <strong>clic<\/strong> a la <strong>primera<\/strong> <strong>opci\u00f3<\/strong> que tamb\u00e9 estigui marcada <strong>suggerit<\/strong>(<strong>Suggested<\/strong>).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"126\" src=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-at-2026-01-29-09-01-15-1.png\" alt=\"\" class=\"wp-image-1455\" srcset=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-at-2026-01-29-09-01-15-1.png 611w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-at-2026-01-29-09-01-15-1-300x62.png 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"459\" height=\"208\" src=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-16-Diseno-sin-titulo-Presentacion.png\" alt=\"\" class=\"wp-image-1453\" srcset=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-16-Diseno-sin-titulo-Presentacion.png 459w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-16-Diseno-sin-titulo-Presentacion-300x136.png 300w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/figure>\n\n\n\n<p>I despr\u00e9s a la part superior <strong>apareixer\u00e0<\/strong> un <strong>terminal<\/strong> i all\u00e0 hi haur\u00e0 <strong>escrit<\/strong> que la <strong>depuraci\u00f3<\/strong> s&#8217;ha fet o si es produeix algun <strong>error<\/strong>, que ens ho <strong>recordar\u00e0<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1025\" height=\"214\" src=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-38-Diseno-sin-titulo-Presentacion.png\" alt=\"\" class=\"wp-image-1454\" srcset=\"https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-38-Diseno-sin-titulo-Presentacion.png 1025w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-38-Diseno-sin-titulo-Presentacion-300x63.png 300w, https:\/\/ahassan.inscastellbisbal.net\/wp-content\/uploads\/2026\/01\/Screenshot-2026-01-29-at-09-22-38-Diseno-sin-titulo-Presentacion-768x160.png 768w\" sizes=\"auto, (max-width: 1025px) 100vw, 1025px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Justificaci\u00f3 dels elements utilitzats:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>try-except-else<\/code><\/strong>: El bloc <code>try<\/code> envolta nom\u00e9s el codi perill\u00f3s. L&#8217;\u00fas de <code>ValueError<\/code> permet separar els errors d&#8217;usuari (dades mal introdu\u00efdes) dels errors de sistema (caiguda de la base de dades).<\/li>\n\n\n\n<li><strong><code>logging.error(..., exc_info=True)<\/code><\/strong>: Aix\u00f2 \u00e9s vital per a la depuraci\u00f3. Captura el <em>stack trace<\/em> complet (la l\u00ednia exacta on ha fallat), facilitant la feina al programador sense mostrar aquesta informaci\u00f3 sensible a l&#8217;usuari final.<\/li>\n\n\n\n<li><strong>Regex (<code>re<\/code>)<\/strong>: Garanteix que les dades segueixen un patr\u00f3 estricte abans de ser processades, actuant com un filtre de seguretat.<\/li>\n<\/ul>\n\n\n<div class=\"wpforms-container wpforms-container-full wpforms-block wpforms-block-f40f511a-7758-4ad5-86c5-8d1e7002a06b\" id=\"wpforms-764\"><form id=\"wpforms-form-764\" class=\"wpforms-validate wpforms-form\" data-formid=\"764\" method=\"post\" enctype=\"multipart\/form-data\" action=\"\/index.php?rest_route=%2Fwp%2Fv2%2Fpages%2F1439\" data-token=\"0bed34a744a676e1df5823f5038439b0\" data-token-time=\"1778175984\"><noscript class=\"wpforms-error-noscript\">Activeu el JavaScript al navegador per a poder completar el formulari.<\/noscript><div class=\"wpforms-field-container\"><div id=\"wpforms-764-field_0-container\" class=\"wpforms-field wpforms-field-name wpforms-one-half wpforms-first\" data-field-id=\"0\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-764-field_0\">Name <span class=\"wpforms-required-label\">*<\/span><\/label><input type=\"text\" id=\"wpforms-764-field_0\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][0]\" placeholder=\"Your Name\" required><\/div><div id=\"wpforms-764-field_3-container\" class=\"wpforms-field wpforms-field-email wpforms-one-half\" data-field-id=\"3\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-764-field_3\">Email <span class=\"wpforms-required-label\">*<\/span><\/label><input type=\"email\" id=\"wpforms-764-field_3\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][3]\" placeholder=\"Your Email\" spellcheck=\"false\" required><\/div><div id=\"wpforms-764-field_4-container\" class=\"wpforms-field wpforms-field-text\" data-field-id=\"4\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-764-field_4\">Subject<\/label><input type=\"text\" id=\"wpforms-764-field_4\" class=\"wpforms-field-large\" name=\"wpforms[fields][4]\" placeholder=\"Subject\" ><\/div><div id=\"wpforms-764-field_2-container\" class=\"wpforms-field wpforms-field-textarea\" data-field-id=\"2\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-764-field_2\">Message <span class=\"wpforms-required-label\">*<\/span><\/label><textarea id=\"wpforms-764-field_2\" class=\"wpforms-field-medium wpforms-field-required\" name=\"wpforms[fields][2]\" placeholder=\"Your Message\" required><\/textarea><\/div><\/div><!-- .wpforms-field-container --><div class=\"wpforms-submit-container\" ><input type=\"hidden\" name=\"wpforms[id]\" value=\"764\"><input type=\"hidden\" name=\"page_title\" value=\"\"><input type=\"hidden\" name=\"page_url\" value=\"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/pages\/1439\"><input type=\"hidden\" name=\"url_referer\" value=\"\"><button type=\"submit\" name=\"wpforms[submit]\" id=\"wpforms-submit-764\" class=\"wpforms-submit\" data-alt-text=\"Sending...\" data-submit-text=\"Send message\" aria-live=\"assertive\" value=\"wpforms-submit\">Send message<\/button><\/div><\/form><\/div>  <!-- .wpforms-container -->","protected":false},"excerpt":{"rendered":"<p>La depuraci\u00f3 (o debugging) no \u00e9s nom\u00e9s l&#8217;acte de &#8220;arreglar el que est\u00e0 trencat&#8221;. En un entorn de producci\u00f3, \u00e9s una estrat\u00e8gia de defensa i una pe\u00e7a clau de l&#8217;experi\u00e8ncia d&#8217;usuari (UX). Un programa que falla sense explicaci\u00f3 perd la confian\u00e7a de l&#8217;usuari; un programa que no valida entrades \u00e9s [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1381,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1439","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/pages\/1439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1439"}],"version-history":[{"count":4,"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/pages\/1439\/revisions"}],"predecessor-version":[{"id":1472,"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/pages\/1439\/revisions\/1472"}],"up":[{"embeddable":true,"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=\/wp\/v2\/pages\/1381"}],"wp:attachment":[{"href":"https:\/\/ahassan.inscastellbisbal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}