Correction d'erreurs (2)

Une fois la syntaxe vérifiée, l'interpréteur lance l'exécution et d'autres exceptions peuvent alors être levées.

Anatomie d'une exception

Commençons par générer un « bug » en exécutant le code ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Commençons par la fin. On trouve sur la dernière ligne deux informations :

  • le type d'erreur (ici TypeError) ;
  • un message expliquant plus précisément l'erreur.

Les lignes précédentes constituent le traceback. Il faut le lire de bas en haut :

  • la dernière ligne indique l'instruction qui a provoqué cette erreur,
  • les lignes du dessus remontent la « généalogie » de cette erreur.

Ici on lit donc (de bas en haut):

Sortie dans la console Commentaire
Traceback (most recent call last):
File "", line 7, in L'appel qui a lancé toute la démarche était à la ligne 7, dans le corps du programme.
File "", line 5, in f L'appel du dessus a été effectué à la ligne 5, dans la fonction f
File "", line 2, in ajoute_5 L'erreur a été provoquée par l'instruction à la ligne 2, dans la fonction ajoute_5
TypeError: can only concatenate str (not "int") to str L'erreur est une TypeError car on cherche à concaténer un str et un int

Corriger chaque programme pour qu'il puisse s'exécuter sans erreur.

Programme 1
Comparaison de nombres flottants

Lorsqu'on écrit a = x ou x est un nombre réel, la valeur de a enregistrée en machine est une valeur approchée de x (quelques fois la valeur exacte). Cette valeur approchée a la forme d'un nombre flottant (le type float en Python). En conséquence, alors que des calculs et des comparaisons peuvent être effectués de manière exacte sur des réels, ils ne le sont que de manière approchée sur leur représentation en machine. On peut donc obtenir par exemple, avec a = x et b = y, l'expression a == b évaluée à True alors que x et y sont différents.

C'est pourquoi les tests ne vérifient pas l'égalité des résultats et des valeurs attendues mais leur proximité.

Ainsi, on peut vérifier que \(\sqrt{2} \approx 1,414214\) en faisantassert abs(1.414214 - sqrt(2)) < 1e-6. Ce test vérifie que les deux valeurs sont proches à \(10^{-6}\) près.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:C,ag)R1Iikn/Sé=vmsuhb.4;ye6+2odt c0(wr5_P3qplf050G0B0H0e0k0U0t0I0J0U0e0t0t0q010H0k0T010406050t0u0s0s0e0N0A040o0F0U0u0:0F0m0I020e0s0T0z0I0h0B0}0N0S0u0B0t050n0`0|0~100^0T041o1v051y0n1y1A1v0^0G0k0r0(0*0,0.0v0k0f0v0U1O0v0H0?050Z0w0U0B1J0+0-011N1P1R1P0H1X1Z1V0H0w0F0G101W0N1w0H0v0(130t0T0e0m0.0E011#1L010V0#0B0m1b0B1V2022271%2a1Z2d0s2f040a0I0Q0N0F0T0F0t0k16180X1~0N0N0B0J2A1o2h0m1w0n1|2M0H1`1_1{0G2j0.1R0m2c2x1V1G1I0)1$2W0k2Y0m1?1H1V0T2F1w2K2M2@0_21182(282-0N0}0U0?0i2J2{0@2`2i2}1%2 310?0E3522372K2V013c0e32040R3g2L0^3j3a0.3m3o0y3r3i2{3k3x0?0O3A3t3C3v3l0F303n0?0C3A1x2=1o2$2P0G2T3k0J1?2p0W1H1w2;0B2?363R3!0X3,391K1%0l0?0X0V3R3u3?0.0M0?0I3|3J3~3l0V0?0t0F0|0B0P0X0t0P2+0r0B0N0t1m433=2)010=040L4n2|450m0?0m4u3k4r0g0b3H384v4p40040I4L421p3-3}4p0t0G0?004V0c3n0J0u0U0I0*0I494b0I0i0n0i0I0D4+0n0E4/0I0x4_4@4,0m4V003H4M424Q2~0?0H0F0Z0U3A52444p0F0?0q5a4G3k0s0k0?0K504M5i3K3^040V3M5h533b0?0k5w5c280F4J2+5B4o2~0w0?0N220f0B4A3K4r4t4O3h5q4w4y5Q454C4E5U3s51515W4p4x0456585H4H5D5f5;3D55573n5^3K5e040D5}455k335Z5d0?0n66285S6a5y045A5%4K5+5?60624p6404346h6j1%4C5o4L6s0.5s2F0H0u0N4z6h5b5I6e5/5|6h0^0n3/3+3S6P0n3V1o0H3X6U2R2N1=1@2P0e1Y6R3V1u3;5=1%2F0s0P0V0e0l4c0v0R0?1g1i1k1m0I5$2_1B371v0j4#1m0H0I0p0f3n1h2c792w0,0k6(0I2C0s2.2a4j4$002+0H4j0r3n1Z701x372$3k1)1Q1S1U3)3T722_6O6,3k5s3`6d3 417R46484a2o4d1m4g0m4i4k4m6r5x0.6c7*5C6e6E2_7+4q0?4D4F7?4J5*7.6H0.4S4U4W4Y4!4$0e4(7X1!4,4.4:4,4?4:4_0x4{0n4}4V6v6G6-3w5`5:6F6x015 5g8t7?6o5n6L5*7?5s5u0N6m546f8I1%5E5z7;368o3D5K045M0m5O7U7-7=7/0.6o6q8!7 7@040d8L8q048P3h8R5~0?618y8#018%8Y7^7136065)5p7?5-6J598`8*8w8.3l8r6K2@8?455 8_9g8u8}7~8p8v687U5-6g2@92948{6z0Y6C8;2L9h5,9e989v1o7M6Q2M6*3U0Y0!0$04.
Programme 2

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:ag)1iknD/S=vmsuhb4ye[2*odt c(w]rP3qplf050A0v0B0c0g0M0p0C0D0M0c0p0p0m010B0g0L010406050p0q0o0o0c0H0u040l0z0M0q0(0z0i050k0/0;0?0^0-0L041118051b0k1b1d180-0A0g0n0W0Y0!0$0r0g0d0r0M1r0r0B0+050R0s0M0v1m0Z0#011q1s1u1s0B1A1C1y0B0s0z0A0^1z0H190B0r0W0{0p0L0c0i0$0x011E1o010N0T0v0i0c0o0v1y1$1(1-1G1:1C1?1^0+0a0C0I0H0z0L0z0p0g0~0i0C0P1!0H0H0v0D2d111{0i190k1Y2q0B1W1V1X0A1}0$1u0i1=2a1y1j1l0X1F2A0g2C0i1S1k1y0L2j192o2q2U0.1%2e2I1.2N0H0=0M0+0f2n2Y0,2X1|2!1G2$2(0+0x2,1(2.2o2z012?0c2)040J2`2p0-2}2;0$30320t352q2R0v2q2G2t0A2x2~0D1S1_193j1c2S2/2p3e053o0P2T2Y2~0h0+0P0N3x381n1G0F0+0C3I3C392 0N3F0z0q1B0v3P2:3K0$0*040E3Z2Z3#2 0+1N0v0c0q3*2~3%0e0b3e373Q3,3M040C413O122-3v2~0p0A0+004b0j3V3X0W0r0c0K0q1D0n310v0q0H2f000q2e3/3;4b003{423O3J2J013E040N0z0H3e4B3}4D0i0+0g4K463R0z3 2L4R4C2#0s0+0H1(0d3Y442{4S3,3%3)4*3w4Y2=4!04203?3R4.4`3,4O044v3=4:3B3!4D3^3_4z4A424,4N3.0c3X3;4}560+0w5i2#4P5m1G3%0G4X4M1.0z0+0m5t555n505f1C5h535c1.3%5l5G4=3a5o5L5u5q0+5s5P5A1G5w040y5p0$0o0g2^3{113z3h1a3u0k3s2r3l112u2t1R1T2t5D5,5/1k2.5/0Q0S0U04.
Programme 3

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:Cag)1ikn/S=vmsuhb4ye6+2odt c0(wr5_P3plf050A0v0B0d0h0N0p0C0D0N0d0p0p0m010B0h0M010406050p0q0o0o0d0H0u040l0z0N0q0)0z0j050k0:0=0@0_0.0M041219051c0k1c1e190.0A0h0n0X0Z0#0%0r0h0e0r0N1s0r0B0,050S0s0N0v1n0!0$011r1t1v1t0B1B1D1z0B0s0z0A0_1A0H1a0B0r0X0|0p0M0d0j0%0y011F1p010O0U0v0j0d0o0v1z1%1)1.1H1;1D1@1_0,0a0C0K0H0z0M0z0p0h0 0j0C0Q1#0H0H0v0D2e121|0j1a0k1Z2r0B1X1W1Y0A1~0%1v0j1?2b1z1k1m0Y1G2B0h2D0j1T1l1z0M2k1a2p2r2V0/1(2f2J1/2O0H0?0N0,0g2o2Z0-2Y1}2#1H2%2)0,0y2-1)2/2p2A012@0d2*040L2{2q0.2~2=0%31330t362}2Z2 3c0,0I3f383h3a300z2(320,0w3f1b2T122H2u0A2y2 0D1T1`1a3A1d3y2X132.053F0Q2U3o1o1H0i0,0Q0O3w393U0%0G0,0C3!3T2K300O0,0p0z0=0v3+2;3$010+040F3^2!3`0j0,1B0J0n320v0q0H0p3 2 3|0f0b3m2:403-3(040C4n3*3N2|4i2 0p0A0,004x0c320D0q1D0C0Z0C3;3?2g1E0B0z0~0v0W1D0W461D490W0A000q2f1O0v0d0q4x003m4o3*3#3-42044H1_0J1?0)0v4a3f4,3,1/0z0,0m4{4s3p0o0h0,0E4*4o533`3W040O3r524-2$0,4S480H5h4}1H0z4l2M5o3_4.430d0s45474U5u4j1/3|4g4q374+4+5b5w4:3=4=4@0h4_4b5I4m5M4~505D3i3:5P0v4?0j4^4`5V4|5v5Y040x5!3p4/5l49594n5X3V0,2k0B49115-5}3b5$3?5)5+5U2V0.0k3Q0v2r2S6g3z1l3B2u2w2s1S1U2u5y1D2r3A6d0Q0S0U0p04.
Programme 4

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:Cag)1ikn/S=vmsuhb4y7e6+2odt c0(wr5_P3plf050B0w0C0d0h0O0p0D0E0O0d0p0p0m010C0h0N010406050p0q0o0o0d0I0u040l0A0O0q0*0A0j050k0;0?0^0`0/0N04131a051d0k1d1f1a0/0B0h0n0Y0!0$0(0r0h0e0r0O1t0r0C0-050T0s0O0w1o0#0%011s1u1w1u0C1C1E1A0C0s0A0B0`1B0I1b0C0r0Y0}0p0N0d0j0(0z011G1q010P0V0w0j0d0o0w1A1(1*1/1I1=1E1^1`0-0a0D0L0I0A0N0A0p0h100j0D0R1$0I0I0w0E2f131}0j1b0k1!2s0C1Y1X1Z0B1 0(1w0j1@2c1A1l1n0Z1H2C0h2E0j1U1m1A0N2l1b2q2s2W0:1)2g2K1:2P0I0@0O0-0g2p2!0.2Z1~2$1I2(2*0-0z2.1*2:2q2B012^0d2+040M2|2r0/2 2?0(32340t372~2!303d0-0J3g393i3b310A2)330-0x3n2;2#1p2@3s2_040v3g1c2U132I2v0B2z300E1U1{1b3K1e3I2Y142/053P0R2V3p3A0(0i0-0R0P3G3a3(010H0-0D3.3%2L310P0-0o0A0u1@2E3^2=3:0,040G433z3`0j0-1C0K0n330w0q0I0p4930460f0b3x3/3`3=040D4w3@3X2}3y300p0B0-004G0c330E0q1E0D0!0D3~400j2E2h1F0C0A0 0w0X1E0X4g1E4j0X0B000q2g1P0w0d0q4G003n4x3@4s2%0-0p0A0?0w3g4`3_1:0A0-0m524B3q0o0h0-0F4^4x5a3:3*040P3s594{2@0-4%5o541I0A4u2N5t444b4d0d0s4f4h4)4m3q464q4z384_4_5i5B044~505z4a55575V3j4}4 1`5Z3q56040y5(3:4c045s5M0.5P5p3c3}3 41515=535A5X04585~5Q4|5S5$5}2Y5^015*0k5I5.0s0-226f3`46485=655q044e4%4i4k6k1:4o5g4w6p3)0-2l0C4j12646b0p1-04014O4Q5|0D4Z0C4U0D015-3`5*5,6I5u3c6h5S2w6w1I6m6+5_046P4S693Y6b6y5=0/0k3!0w2s2T6~3J1m3L2v2x2t1T1V2v5D1E2s3K6{0R0T0V0p04.
Programme 5

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:Cag)1ikn/Sé=vmsuhb4y7e[6+2odt c0(w]r5_P3qplf050D0x0E0d0h0S0q0F0G0S0d0q0q0n010E0h0R010406050q0r0p0p0d0L0v040l0C0S0r0.0C0j050k0^0`0|0~0?0R04171e051h0k1h1j1e0?0D0h0o0$0(0*0,0s0h0e0s0S1x0s0E0;050X0t0S0x1s0)0+011w1y1A1y0E1G1I1E0E0t0C0D0~1F0L1f0E0s0$110q0R0d0j0,0B011K1u010T0Z0x0j0d0p0x1E1,1.1?1M1_1I1|1~0;0a0F0O0L0C0R0C0q0h140j0F0V1*0L0L0x0G2j17210j1f0k1(2w0E1$1#1%0D230,1A0j1{2g1E1p1r0%1L2G0h2I0j1Y1q1E0R2p1f2u2w2!0@1-2k2O1@2T0L0{0S0;0g2t2(0=2%222*1M2,2.0;0B2=1.2@2u2F012|0d2/040P302v0?332`0,36380u3b322(343h0;0M3k3d3m3f350C2-370;0z3r2^2)1t2{3w2}040w3k1g2Y172M2z0D2D340G1Y1 1f3O1i3M2$182?053T0V2Z3t3E0,0i0;0V0T3K3e3,010J0;0F3=3+2P350T0;0p0C0v1{2I0N0{1(3|2_3@0:040I4a3D3~0j0;1G0N2T0E0x0q4g344d0f0b3B3?3~3_040F4B3{3#313C340q0D0;004L0c370G0r1I0F0(0F42440j2I0F1{4U0d1(0m480h0Q0r4p4L003r4C3{4x2+0;0q0C0`0x3k4=3}1@0C0;0n4}4G3u0p0h0;0H4:4C553@3.040T3w544?2{0;4n4p5j4 1M0C4z2R5p4b4i4k0d0t4m0C4o4q4E2v5d3~4d4v5F0=4;4;5H4@044_4{5v4h50525U3n4^4`1~5Y3u51040A5%3@4j045n5E2$5k0,4d0y4r3u0q1;0401480s0q015`4c0;0K5b4B5P5l044V454|5L4~5w5W04536g6a3g5!5T5L6n015)0k644i0t0;266w1@4d4f6r5?355m5C5o6F5q5@0;0f686h5V1M5f2p0E0r0L166m6G5.6d4X6f2!0?0k3(0x2w2X6.3N1q3P2z2B2x1X1Z2z5z1I2w3O6+0V0X0Z0q04.