You are on page 1of 24
©8068 008088009008 08H0O808 000990088 88 Programacdn avanzada con Mirosot Visual Basis.NET Matrices come miembros pablicos de una clase Una interesante novedad de las matrices es que pode exponetlas como miembros piblicos de una clase Eo significa que el siguiente edigo (que provocarfa un eror de compilacign en las versiones anteriores el lenguaje) es perecramente legal en Visual Basic NET! clase peceana ' Proporcionar hasta ¢ Linear para a airecetén, fublic Dieecelonie) a2 seei0g En Visual Basic 6 deberia crear un par de procedimsientos Property Let y Property Get que tomaran un argumento mumérico y defiieran o devolvieran el elemento correspondiente de una maiz prvada, La solucién de Visual Basic NET es més concisa y eficiete. Estructuras ‘Ya no poses utilizar el bloque Type..End Type en Visual Basic NET. Este ha sido sustituido por et bloque Siructure..End Structure, que ofrece muchas nuevas caracteristicas y se parece més alas clases que los antiguostipos dfinidos por el usuario (o UDT) utilizados en las versiones anteriores del lenguae, Podré tener una estructuca a nivel dt espacio de nombres, dentro de un blogue Class o Modu block e, incluso, deniro de otra estructura ‘Los miembros contenidos dento de una estrctura deberin venir prefijados por un calificador de acce- sibiidad (visibilidad), como sucede en el c6digo i fe seeing bis equtvale a Public en este caso, Dig ageliieo ae Stetog Privte to ae Steg La declaacién de los miembros de datos de la estructura no podrd intuit iniciadores a ilizar Ia sioxanis dela declraci6n As New. Como sugieen fos comentarios contenidos en el ejemplo anterior, cl nivel de aecesiblidedpredeterminado paa Is estructuras (que es el nivel de vsibilidad impicado por una palabra clave Dim) es Public (a diferencia de lo que sucede con las clases cuyo nivel prdeterminado es Drivte), Visual Basie NET unica a sintais de las clases yde las estructura, las estructurassoportan la mayor parte de las caratefsticas de las clases, ineluyendo los métodos Function Nonbeecospietol) as string owbrecorplete + hosuee ks" i spelt ids 4 Funeeton A igual que sucede con fa clases, las estructras pueden incluir progiedades (si desea obtener mis informacién, consulte la seecin denominada «Propiedades» del Capitulo 4). Sin embargo. a diferencia de To que sucede con ls clases, la estructuras Son tipos de valor en jugar de ipos por referencia. Entre otras cosas, est significa que Visual Basic NET inicializa automiticamente una estructura cuando declare una variable de este tipo: en otras palabras, la siguiente linea: Capitulo 2: Méduos y variables 89 Es equivalents 2 una de las siguientes instrucciones: ev exteucpersona() Inictatdsador descriptive _ Lasse fie nitrate conse sa pets, ii cada memo dela stu alr preter (0 pars miembros oamericon,cadcne nua pra miembros Sn Noting pura miembros de objets). Resta legal deine explctanente un contr sn pardmetes © es ener aa nr Fe pest nea conc Nv son span) como $e inden continua sus hes(eyint tore 24° Stclng, Ayla Apeslide Ae Sting) necnoesre Sombre vers Ls teetitas pelases (Consulte el Capulo 4 para obtener més informacin sobre Jos métodos constructores). El método cons- tractor es especialmente importante porque le permitiréinclalizar correctamente los miembros de Ia es ‘euctura. Que pueda adminisiar esa taea resulta vita, por ejemplo, cuando la estructura contenga cadenas de longitu fja 0, con més precisién, su aproximacién més cercana 2 NET Framework: Din Apeilido As seeing S"Sumuiae una cadena ae iongited fia Dia CodPostal Ae Mecosafe Visuniaasi Compatibility 16. Plxedcangthsceing fb wewyent onbes As Sseing, AA 1210 Ae stein) inicielisar te de donated #15 lerosa¢t. vtsualsasic.Compartbiiity.s.Pivadbengthstsing( 10) snd sub digo restante cons en 61 caso antesicr! {Una ver dich eto, deberd pensar en Is cadens de longi fs como se timo eecurso porque resulta bastante preferbe conversa on cadens normals cuando ext Cnviindo ne apiacinesehaen a ‘ern snide ete lengua ‘Una consecsencia del ipo de valor presents en las varables Stricture esque Ios datos se copiarta wand sign una vrable de estucura avaiable, mientras que so se copa tm pnteo and se ‘signa an valor poe referencia una variable. Tambign cert tener en cients que m0 pos iar e 90 Programacdn avarzads con Microsoft Visual Base NET operadar igualdad con las estructura, El siguiente c6digo resume ls diferencias exstemes entre clases y estructuras: sob conerartateveeursie Haw e2 opciona Spare apelisés = "Soe" ‘ia Manadn at adtodo y a 1a propiaded canbida ee idéntice console: nriteLine|eFers Noobs fangiezel}) Sonasie.westcLine|aPoss Monbseconpieest)| ee Boe 1a esignacién a una variable del aizno tipe tiene efectos étstintoe, Dig cPaced Ae Persona = cpere lun puntero al objeto original Se ha agectags al chjeto original console. teitetsne(cror® Hombre) + ena Copia de ta eeteuctura eriginal = prorat nonce = "asa? En Visual Basic NET, las estrcturas no son compatibles con algunas otras caactersticas de las clases, Por ejemplo, las estucturas heredan de manera implica todos lob métedos dela clase Object, pore wo pueden heredsros explcitamente de otra estructura, ni tampoco pueden set heredados Después de esta primera exposicién de los cambios sintdcticos més importantes relacionados con ta forma en que se declan y uiizan fos médulos, las clases y las variables, estrépreparado par ver qs Sgt coneeptos han eambiado en llenguae yedmo por controlar el flijo de eecucion en Visual Baie Control de flujo y manejo de errores ‘A pesar de los numerosos cambios que se han producido en la sintaxis bisia del lenguaje, el e6digo de Visual Basic NET sigue pareciendo Visual Basi. La mayor parte de las diferencias se encuentran en los eralles, lo que significa que, en ocasiones,tendré que prfundiza bastante en la especificacign del lengua Je para encontrar las novedades de Visual Basic (Que tendré que buscar cuidsdosamente para encontear cambios, resulta especialmente cierto en Tas, instrciones que guardan relacin con el contol del flujo, tales como las instveciones que conttlan el fujo de ejecucién y de definicién de procedimientos que analizaré en la primera parte de este captul, Posterionnente, le mostraré qué comands de Visual Basie se han mantenida en esta trascion a Visual Basic NET y cules otros han sido sustiuidos. Finalmente, la hima parte de este capitulo explica las ‘excepciones que existen en la forma que tiene NET para controlar los enres, CONTROL DEL FLUJO DE EJECUCION Visual Basic NET ha heredado la simaxis de la mayorfa de ls intrucciones que gobietman el jo de ecucon, tales como los bucles If, Fr y Do; sin embargo, otra instrucciones del viejo estilo han desapare- ido, por ejemplo GoSub, La mayoria de os ezmbios en fa sintanisestéa relacionados eon fe forma en que 5 definen y ejecutan los procedimientos Procedimientos Como sucede en las versiones anteriores, Visual Basic .NET permite el empleo de procedimientos Sub y Function, que pueden ser Private, Public o Friend. Las definiciones de los precedimientos pueden incluit los parémetos ByVal y ByRef, pardmetros Optional y argumentos ParamnArray. Sin embargo, existen algunas diferencias importantes que deberd tener en cuenta cuando convierta una dplicucén heredada para {via erroressutils y cuando constrvya una aplicacinpartendo de cera para evitardisminucionesinnece- Sarias en el rendimiento, 0008008 8O0O80O90GHSSHH8HHHOOHHOHHOOS ©0088 008008009069 0880O0 0080008808 92 Progrmaién avanzada con Mlrosot Vu Basie NET Llamada a Procedimientos ‘Ua cambio importante en la sintaxis de Visual Basic INET es que Ia liste de argumentos que se past & tun procedimiento debe encontrarse encerrada ene paratesis, con independencia de que estéllamando tun procedimiento Sub o Function: + tianada a un procediniento Sub wubeoctbipeiners, sezutso) Convenientemente, el editor de Visual Stadio INET colocard un par de paréoesis alrededor de a lista de argumentos si se olvida de hacerlo usted mismo. Si evando desarrolitba aplicaciones en Visual Basic 6 Uilizaba adecuadamente Ia instuceién Call para invocar ls procedimientos, no tendrf que alterar dicho ‘digo porque en Visual Basic NET se puede seguir utlizando la instruccién Call: alt wiecoesublpriners, segundo) ‘Si Option Strict se encuentra acivada, no pod utilizar ls conversin implicia de restricciones cundo cesté pasando argumento: aun procedimiento. Por ejemplo, cuando pase una Variable Double aun argumen- fo Single deberd realizar una conversin explicta ulizando la funeién CSag: Nieoe Geng) gb wiprocieyial 6 As single) ed sob ‘sin embargo, si Option Strict se encuentra desactivado, Visual Basie NET es incluso més perisivo que las versiones anteriores del lengua, Por ejemplo, el istado siguiente provoea un eror de compilador del tipo «No coincide el tipo de argumento ByRef» en Visual Basic 6: ub ProbartlanadabyRet0) pasar un acguneato Integer a un parémetro Long ByRef. Gell tarcoetinevaior Sub WLproclByRe€ Ingheg AE Cong? ngarg = 9999 end Su Exe mismo ebdigo se compilard y se ejecutard corectamente en Visual Basic NET (siempre que Option Strict se encuente desactivad), Sil valor asignado al parmetro pertenesiente al provedimiento (IngAre nel ejemplo anterior) es demasiado largo para el tipo dela variable original (ineValor en el ejemplo), se producira un error de desbordamiento cuando se salga del procedimiento. Nota_La regia que exiga encerar entre pavéntes's a los argumentos no es apiable a un pequetio ‘up de comands de Visual Basie NET, ane fos que se incluyen Throw, AdsHandler y Remove Flardier. La diferencia clave en est 0230 ¢5 que estos comancos son as palabras claves del engusje ‘en lugar ce lamadas a métodos, Argumentos ByVal y ByRef De forma predeterminada, Visual Basic NET pasa los argumentos utlizando ByVal, y no ByRef como sucedia en as versiones anteriores del lenguaje, incluyendo Visual Basic 6. Si est conviriendo manual tent unaaplcacin heredada, debers agregar con cvidado la palabra clave ByRef# todos los argumentos Captula 3: Contr de fujoy manga deerares 93 {que no incluyan explicitamente Ia palabra clave By Val. Por ejemplo, el siguiente procedimiento en Visual Basie: Sub witsocix Ae Inseger, Byval y Ae Lona! Debers converse en lo siguiente (observe que también se ha modiicado el tipo de dato): sup Mepeas(hyeat x Az Short, uyfal ¥ As Iategee) Como he comentado anteriormente, la palabra elave ByVal es opcional, pero resulta una buesa préctica cespeciical, especialmente sel cédigo vaa ser utlizado por disefadores que no estén failiarizados con los auevos convenioe de sintaxs prevetes en Visual Basie NET. Mejor adn, cuando esté convistiendo ‘digo desaerollado con una versi antigua del lenguae, deberd reconsderar si desea pasar a variable pot referencia: los disefadores de Visual Basic 6, en ocasiones de forma ireflexiva, omian Ia palabra clave [ByVal pero, en realidad, no querfan pasar todos los argumentos por referencia Eltema es que, en la mayoria de los casos, un argumento pasado por valor también podria ser pasado por referencia sin provocar problemas apaentes(naturalmente, lo opuesto noes cierto: podré verde forma inmediata cuando esté pasando erneamente por valor un argumento que debiers haber sido pasado por referencia porque el Ilimadorreebird un valor no moditicado). Sin embargo, cuando en Visual Basie 6 tilice implictamente ByRef, cuando debiera haber uilizado expticitamente ByVal, staré provocando una fuente poteneial de sutles erores y también estardimpidiendo al compilador Ia posibilidad de realizar un ben abajo optimizando e! eédigo resultant. Si, posteriormente, transforma el digo 2 Visual Basic NET (por ejemplo, importando el proyecto en Visual Studio.NET) seguird persstiendo la inefcienca y la posibilidad de inrodueicerrres Como pasar Matrices A diferencia de lo que sucedia en versiones anteriores de Visual Basic, pode utilizar la palabra clave ByVal para pasar matrices como pardmeteos, Sin embacgo, las matrices Visual Basic.NET son variables de tipo oe referencia, en otras palabras, punzan al éea dela’ memoria contenie en el montén administado ten que se almacenan los elementos de la mattiz, Por ello, cada vex que pase la mattiz por valor o por referencia, en realidad estard pasando un puntero de 4 bytes. En todos los casos, ls cambios producidos en Jos elementos de ' matriz dentro del procedimiento que ha sido llamado se refljarén en In matrz original: up PeobaratetsRocval ) Sin snaiateas(| Aa tateger = (0, 2, 2,3. 4) (console vienna unavatsiz(3)) Sse oa Sab sub aesayaesosyval [aylal matciz() Ae Eecages! Por £2970 Gaoundinatess) Pasar una matric uilizando ByRef o ByVal tend diferentes efectos si utiliza una instruecién ReDim ‘enzo del procedtniento que he sido llamado, En este cao, la mattz orginal se vers afectada sila pasa ‘como argumento ByRef, peo ao To sera si fa pasa como argumento ByVal, Paa ver mo funciona este 94 Programacion avanzada con Mirosf Visual Base NET sistema, vamos aconstrir un procedimiento que toma dos matrices como arguments con diferentes meca- nismos de waspaso: ea csspoeees) Hisar gua saceiz ha eido aiectads por FeDin SPO ne mosisienaa) 09 tseasescesa) Sub Matriztroctortet\ayéal mateiet) A tntes ‘Genbisy ei tarats de anes necricee ang Su Dyfet maceiz2() As tnteses) __&usndo pase una matriz como pardmetro deberdespecificar su rango, Por ejemplo, el siguiente procedi- ‘mento acepta una matriz Long bidimensional y una matriz String tridimensional. Sub wiproe(eyval mateiz{,) Az tong, Byval 221, .) Be Seeing) tea Sah Argumentos opcionales Pdr definirargumentos opcionatesulzande la palabra clave Optional, como hacis con los procedimien- {os de Visual Basie 6. Sin embargo, siempre debers proporcionar un valor predeterminado explicto para cada argumento opeional, incluso aunque el valor predeterminado sea un 0-0 wna cadena vacta: sub wlezee(Optéonal ByVal x Ae 2 optional Byial y As ering = na bu La funcidn IsMissing ya no esté presente en Visual Basic NET por este sencilo motive: la funcién |sMissing devuelve True s6lo cuando se omite un argumenta Variant, pero en Visual Basic NET ys no bude uilizar el tipo Variant. En su lugar, deberd proporcionar un valor predeterminado especial para un 8rgumento y comprobarlo dentro del procedimiento si desea deteminar si ha sido omitigo Sub Miproc optional Byval x As Short = -2) ress ct then Ya onitta> at arsunente x Normalmente, utlizaré ~1 com valor especial siempre que ef argumento no pueda adoptar valores ‘negativos: tambigm podré uilizar el menor nimero negative 0 el mayor ndmero postive permlde por igh tip auntiso, En ee cso, pode liza as popiedades Min ale y Mo Value qe exponen toss las clases numérica: {88 MLProe opclonal Byra1 x A Se ha onitids el argunen =9223312036884775008. Canta 3: Cont de rujo y manejo de erores 95) Siel argumentoopcional es ua Single o Double pods uilizarel valor especial NaN (No-es-un-némero) coma valor predeterminado ub Witsoe open yal «Az Souble = couble. 33m) El valor NaN ce sign a un ndmeto en punto flotante cuando realice operaciones que no devueiven un ndmero eal, pr eemplo, como cuando pasa un argumiento negativo a las funciones Log o Sq. Por ello, existe una posiilidad (muy pequena) de que pueda pasar este valor por eror el progedimiento, como sucede en el eigo siguiente: nstrvceléo pasa un valor NaK a MiP, Procite sere) Argumentos ParamArray Podri crea procedimintos que acepten cualquier nimero de arguments opeionaes sin mas que wilizar la palabra clave ParamAmray. Es una estupenda mejora con respect alas versiones anteriores del lenguaje, odd defini matrices de argumentos de cualquier tipo (Visual Basic 6 y Tas versiones anteriores slo permitan el empleo de matries Variant para argumentos ParamArray). oncom Selgin scanty augeil Ae Iatages) Ae Inteser na Panction En el céigo atror podré apreciar otras dos diferencias exstentes con respect alas versiones ante- riores del lenguaje. Observe, en primer lugar, que los argumentos ParamsAray siempre se pasan por valor por lo que cualuier cambio producido dena del propio procedimiento no afectaré a lamedor. En segun- ‘do lugar, nunca pod omit un parimetro para un procedimiento que espere un ParemAray nesuttads seit 3) . De forma iteresante, el parimetro ParamArray es una matriz desde cualquier punto de vista y podrd spicata todos is métodos defnidos para las muatsies en NET Framework. Pense ena siguiente funcién ‘que devuelve el valor minimo de todos los argumentos gue recibe Funct loa Valortin(Syvet Paranasray axge() Az Gbject) Ae Obie Din sae shore Si'no secibe login ergunento, fe arosii) « vasa (8) [NET Framewotk dispone del métod Sort con el que podtd ordenar una matrz de cualquier tipo, porlo ‘que podréreseribrlafunci6n ValorMin de una forma mds concisa (aunque no necesariamente mas epida) €28200008000060060930808 8208060089 80008000'08 ©8980 08CO8088089HOH080HSH8OOHHCOROOCO 96 Programacdn avanzada con Microsoft Visual Basic.NET punction Valeciin(@/fal Peranazray args() As Gbjest) Ae Object TGhataac ta wateie y avoives su priner elesence Yelowmin © 82920) ‘Cémo devolver un valor Las fanciones pueden devolver un valor asigndndolo al nombre deta funcién (tal y como hacia ea Visual Basie 6) o utilizando la nueva instcci6n Return Function eblar|ayval x AS tona) As tong amg Panetion La instrucidn Return resulta especialmente til cuando una funcién cuenta €on varios puntos de slid porgue le evtaré tener que escribir exlictamente una instruei6n Exit Function, También podré utilizar la Fstuccién Retur para devolver matrices, como puede ver en este cdigo: eweive una mateis infotalézads con valores tnteges rel fargo 08 tol putdelon Inlciatfeantstets (ayval a AS Integer) AS Bia cen(aly # ae inceser for isofoa sey et 1 vatios puntos de salida (como sucede ea fos ejemplos anteriores) puede que prefierautlizar la aueva instuccidn Retura porgue podré modificar el nombre dels Funién sin tener que rriicar también todas las apriciones del nome de la funci6n dentro del provedimiento. Se trata d= un pequeto detile que puede ahoralealgin tiempo durante la fase de puesta @ punto ‘Visual Basie NET (como succde en las versiones anteriores) le permitird utilizar el nombre de le fancion somo una variable loval dentro del procedimiento. En muchos casos, esta tictica le permite aho~ frase ef problema de tenet que lizar una declaacin de una variable local por to que podré desarcollar Ttigo os conetso, Por ejemplo, la sguienteversinaltematva de la funcién Sum no wiz fa variable estado y no requiere una asignacida final al valor devuelto de Sum: Incluso cuando no teng Punction Sunt ial Paranarcay axgs(] As tnteges! As Toteres Por indice + 03> Ubcundiares) 8nd +2 angelindice) sea FusetLon tacién de Microsoft indica que a instrucei6n Return puede mejorar el rendi- rominada después de Ia funein puede impedir que el compitador Justi fanca he observado una sustarcial diferencia en rendimiento entre estas ‘era se tata de un nuevo Sin embargo, la document miento porque Ia variable loca! ‘Time (ITT) optimice el eédigo. Ni ‘don tgenicas, al menos en pequefias rina utilizadas para medi rendimientos, motivo pars utilizar Ia nueva instruccién Return siempre que sea posible Instrucciones condicionales y de bucle Visual Basie INET permite el empleo de todas las instrucciones condicionalesy de bucle ulizadas en sus predecesores, es devi los bloques condicionales If y Select y ls instuscions de ble For, Do y While. Sin embargo, NET Framework también ofrece nuevas posiilidades en este des Captulo 3: Conrl de tj y manejo ce erores 97 Evaluacién de cortocircuito con los operadores AndAlso y OrElse La evaluacién de cortociruito le permit’ evitar a innecesara evaluacién de subexpresiones de tipo Boolean si stes no afectan al valor de laexpresin principal. Veamos un sencillo ejemplo: ie at > 0 And sqcina) <1 * 2 Then ok * True ‘ila vaiable nl es 0 0 negative, la expesion anterior sélo pod ser falsa, con independencia de que la | Subexpresin que sigue al oprad Basic siempre evaluaban toda jor And se evalde como True o False. Las versiones anteriores de Visual Ta expresion If, por lo que se producia una pérdida de cendimiento do los nuevos operadores AndAl- ‘Visual Basie NET le permite producircbdigo mis intligente uti so,y Orélse, que fuerzan una evaluacién de corocircuito: 24 ab > 0 Andalae Suelo2) < ai * 2 Then ok = Tee sta expresién es equivalente al siguiente c6digo més explicito: Bvaluscisn de cortactzculto “manual utah > 0 Then Te sorina) < 2 soa Fe Pode uilizar la evaluacién de cortocircuito en aquellassituaciones en las que ui ‘thon ok = true cl opersdor OF: re mt > 9 of Login2) > 2 Then ok = Teue En est eso sia veriable nf es mayor que 0, toda a expresin ser True con seguridad, po lo que evaluar fa segunda subexpresion Log(n2) es un deroche de esfuerzo y de tiempo. Podré forear un comportamieato rns intligente uilizando el nuevo operador OrElse: Estos nuevos operadores funcionan también dentro de expresiones Boolean més compejas ‘odas les varlabies son 0 im at, 2, mi As tategee muses SIDMGES obese az ya? es suticiente, ‘oanuaise (a2 + 0 Orflae sie 01 thea ok * True Laevaluacin de comtocircuit fe ayudard a evtar muchos ercores en tiempo de ejecucién sin tener que scribe mucho ebdigo, Por ejemplo, pod ulizar Ia siguiente técnica para ler una matriz de elementos Slo sel indice se encuentra dentro de wn rango vilido Tpsceisti) extzve y a8 pocisive Veamos otro ejemplo: uate evitar un accor de aivieldn poe cero. ietnh ted ancaleo sd | Rls al then ok © Tue Eloperador AndAso le permit evtar errores cuando comprueb la propiedad de una variable objeta que pueda ser Nothing 0 Tos elements de una mairz que pueden no exist datinis ok cons true a obj.valus ha sido definida y no es segaziva seat tabi te Nothing) Andalzo aj.Value 2 0 Than ok = eve 98 Programacionavanats con Microsoft Visual Basic NET Definir ok cono True si se ha éefinido matrizin) y e# igual a = s€h ee Uboundinatsis) AndSiea nateisin) soi then oka fous La evsluacién de conocicuito puede acelerar sus aplicaciones, pero deberd tener en cuenta erores suules que pueden desizarseen su c6digo. Esta stuacin es especalinentecievta cuando la subexpeasion ‘ontienefunciones definidas por el usuario que puedes alterr el comportamniento del programa, Vesmos el siguiente c6digo: Hin] = 0 Andaiso increnentar(n2) > 10 then ok + Tove Pancon snccenntasieynct Salvo que esté famitirizado con la evaluaci6n de cortocirevito (lo que puede ocurir ies un programa: or asiduo en C/C++ Java) puede que no se dé cuenta inmediatamente de que la variable 42 solo se inerementard sia variable n! es cero, Podré mejorar a legbildad de su cédigo utilizando iastrucciones If nidadas, en otras palabras, escribiendo lo que se podria denominar c6digo manual de cortociruite 1 250 ha Inecenentgo 22? TE thctenent n2) > 10 then ok + teve Los operadores And y Or funcionan en la misma forma en que lo hacian en Visusl Basic 6 ycealizan operaciones debits mis que uténicas operaciones de tipo Boolean. Podré tlizarlos para crea eSdigo de ‘manipulacin de bits como siempre lo ha hecho: j Neriticar of 20 na gefisido et bie (acesicard veltizer is funelén GSooi si ee ha activade Option strict) 14 choo! (nl Aad 2} then Nota. crsot introdujo les nuaves operadoras AndAlso y OrEtes en la versién Bola 2 de Visual Basic INET; en Beta |, os operadores And y Or realzaban auiomatcamentelaevaluaién ce coercane Microsoft recuper su antigua seménca presente en Visual Basic 6 porque la ranstormaccn del oom: 90,08 Visual Basic 6 hubera sido enormamente comple (la evalvacion automdica do corcercltos Fubicaitroducdo eres). Gurosamenta, hace ahora 10 afs, la anciana versién de Visual Basie ara MS-DOS permiia ia evalvacién de cortocrcuto, pero no recuerdo que nadie se qusiaa de io ‘Compatbilidad hacia atrés con ol entonces popular lenguaje QuickBasie, Visual Basie NET. utilizada en tas versiones anteriores del lenguaje. Visual Basic .NET tambicn permite el empleo de le Palabra clave While, pero este ipo de bucle se debe cerar con Ta palabra clave End While (en Ivgas de ‘ublizar I palabra clave Wend), Podr salir de un buce While utilizando la instuccién Exie While permite el empleo de bucles For y Do y ésos siguen exactamente la misma sintaxis ‘Sapte 9: Contr defo y mango de erores, 99 En los bucles While slo podré introduc Is condicisn al principio del bucle, a diferencia de fo que sucede en los bacles Do que le permiten probar la condicién de slida tant al principio como al final del bucle. Por ello, no tendré motivo para preferir el empleo de los bucles While, End While a los bucles Do..Laop y, de hecho, en est libro no veréningin otro ejemplo de bucle While.End While GoTo y sus variantes Visual Basi 6, y tas versiones anteriores de este lenguaje permitfan el empleo de custo tipos de instnie- ). La palabra clave Return, que anteriommen. ‘ese utlzaba para volver de las subrutinas GoSub, sigue siendo vélida en Visual Basie NET pero con una sintaxis y semsatica distntas (consult la seccién denominada «Cémo devolver un valor aneriocmente en este capitulo). Ineluso aunque Goto sigue estando disponible, no deberd sbusar de esta instraccién, Una buena regla bisica es utilizar Goto slo cuando se produzc alguna condicién excepcional, tal coma cuando dese salir de un bucle profundamente anidado o de una estractura IE 36 = 0 mon Goto salictte ate ma te nue ena te Enlseite Las instueciones Goto mostadas en el ejemplo anterior son, probablemente, a forma més limpia de implementar el control de fujo necesetio (salvo mover todo el blogue Ifa un procedimient independiente) Y de aclarareleédigo. No deberd tomar este comentario Coma tna excusa para crear c6digo espaguet sl Vio esto, Hiblando de eiqueta, deberd tener en cuenta un misterioso comportamiento del lengvaje Visual Basic .NET. Como yasabe, puede inserar varias instruciones en la misma linea, utilizando los dos puntos como separador: (Cuando Ia primera insirucin sea una llamada ¢ un procedimiento sin partmetos, el compilador se con fundies pensando que en realidad est uilizando und eiquet Este cétigo no funcionard cons ef scribisiolas Console. trteezse(‘tande'] 0 Esceibicrsta() 0S HFHFOSHHSHHBHNGHHHHHHHHHHHBSOSAOHE ©F6OFFSFHHOHHHHIHHHOHHSHHOEHHOHHHOCE 100 Programaciin avancats con Microsoft Visual asic NET Este comportamiento es comin a todas la versiones de Visual Basic. Podré resolver la ambigieded en Visual Basic NET affadiendo un par de paréness tras el nombre del procedimient: ola mands La instruccién Declare Visa Basic.NET penis el empleo dea instcsitn Declare con a qu pode lamar a procedinientosy Thssores covtndds en DLL-entres-A dtrencia do que suede en versions anteires del lengua, evs aistrceign Declare en csquer sit ened su apni, inlyendo mls, fom Faas blues de clases. Vad Bt NET ped egegarun moiiador que indleard a. qu formato (ANSI o Unicode) e desen converte as cadena Ese muincadrdebr enconease so deiris apes clave Delaey poede ser uno do siglentes valores: 1 Ansi, Todas las cadenas se convertrin a ANSI (opcin predeterminada}, 1 Unicode. Todas las cadenas se coavertrin a Unicode WE Auto. Todas les cadenas se convertinn a ANST en los sistemas Windows 98 y Windows Me y a Unicode en Windows NT. Windows 2000 y Windows XP; ademés, si no se suministra un nombre de alas, el punto de entada actual se derivard afadiendo una A al nombre de la funcign en sistemas Windows 98 y Windows Me y una Wen sistemas Windows NT, Windows 2000 y Windows XP. Cuando convieta sus instrceiones Declare desde Visual Basic 6, deberd convertic con cuidado todos tos argumentos Integer a Shor todos ls argumtentos Long a Integer. Por ejemplo suponga el siguiente ‘Codigo de Visual Base 6 que recupera el manejedor de una Ventana denominada Sin tu - Bloc de nota, ‘eambia su tamafo y lo taslada hasta a esquina superior izquienda de Ia cadene: eeivate pectaze Function FindMindos Lib ‘useri2" Alias “Finaiindonns {Sivel’ipelesstons As Seeina, bylal Lpeindawiane As String As tobe privacy Declice function Hovetindow tib *usesi2" vai Sepaine, Aa tong) Ae bond oth: Bjecute a] Bice de notas y absa un documents vacto antes de efecutar este eddiso, ub protacbuscacventara( “Gasanos whcllateing porgue ae canocenos La ana. hands Fiodialndoriwattiseeing, "sin eteulo ~ Bloc de notes") ‘Caabia of exrano de la venvans y desplaze el titulo a Le eaquina Et c6igo anterior se convert en Visual Basic NET en fo siguiente (1 catitizador ansi ax opetonal “Hediindoa ayes hae Function oveiandow Lib esec32* Alias *Hovatindow” — yaighe Aa Integer - yest it Byiat bes nora: ejecute 1 Bios da notes y abca i docunsato vacie antes de ejecuter ete cétige noe ¢6 notes") [apie 3: Contra fo y mang deerores 101 2E tind <> 0 Than Movetindowlhind. 0, 0. 600, 309, 2 na Sus Detalle importante: Visual Basic NET no permite el empleo de la constante vbNullString y tendré que sustiuisla por Nothing cuando desee lamar a una funciOn definida en una DLL. Hay mucho més que aprender sobre emo lamar a los procedimientos externos, como verd en la seccidntitulada «El atributo Dillmport» contenida en el Captulo 7. COMANDOS, FUNCIONES Y CONSTANTES Como ya he comentado en la seccién aL. instuceisn Imports», en el Capftulo 2, los nuevos proyectos suclen importa ciertos espacios de nombres que son vitales para su correcta funcionamiento. Uno de estos espacios de nombre es Microsoft VisualBasic, que expone la mayor pate de los comandos, funciones y constants del lengua, Oo es Microsoft VisualBasic. Compatibility VB6, que contienen las clases que le syudarin a conver aplicaciones a Visual Basic INET desde versiones anteriores, uilizando el Asistente para actuaizacion de Visual Basic La mayoria de los comandos pertenevientes a estos espacios de nombres han conservado su sinexis, ‘original y suponde€ que ya sabe cdmo utlizaros. En este apartado, me centraé exclusivamente en las Conerolchars. ett La clase ContolChars contiene las siguientes constantes: Back, Cr, CeLf, FonmFeed, NewLine, Null- Char. Quote. Tab y VerticalTeb. Observe que In constante vbNullStting ya n0 es compatible con Visual Basic NET; como comenté en la seccién La instruccién Declare», anteriormente en este capitulo, pode pasar una cadena nula 8 na Funcién API utlizando la constante Nothing, Funciones de cadena Lalas Microsoft VisualBasie Strings expone la mayoria de ls funciones de cadena de Visual Basic, tales como Ase, Chr. CheW, Filter, Format, FormatCurency, Forma:DateTinve, FormatNumber, FormatPercent, InSt, Inte Jon, LCase, Left, Len, LTrim, Mid, Replace, Right, RTrim, Space, Split, SuComp, SuRe verse, Trim y UCase. Las Tunciones que podfan utiliza varias sintaxis (por eemplo, nSte y Mid) se han ‘obcecargado convenientementey se permite el empleo de todss elas (consulte el Capftulo 4 para obtener nds detalles acerca dela sobresarga). Estos méodos se definen de forma global, por fo que no tends que 102 Programacion avanzada con Merson Vive Basic NET ini el nombre complet de a cas pr jcvtrion incluso sungu neces eps e nom ‘completo de las constantes que estén relacionadas con ellos: ms * ee SEES oF cages sis sist saylscuas de minuscu cyto Then fees sua La mera fun Sup ssi nin Sing, ue no poe Vol licen Vinal Base NET porque String €s una palabra reservada: 8 2204 snstruceién inpring una lines de $0 guicnes console. nrieeLizelserbupis0, *-"I1 cag ICH € ua mae Fanci que devuelve un carder senillo en una deteminadaposicisn de wna console eseLine oetthe -aBcoe*, 20) aay Tay como cabvia espera, Visual Basic.NET no permite el empleo dels fncones por ee Left$ 0 Spaces. m= m ‘ Sper sien: Funciones matematicas Las funciones matemticas de Visual Basic INET se encuentran implementadss en la clase System Math, defiides en el espacio de nombres Microsoft VisualBasic. Se pueden clasificar las funeiones matemtion, en los siguientes grupos 'M Funciones aritmética. Abs, Ceiling, Floor, Min, Max, Sqr, Exp, Log found, Pow, uncles ait ing, art, Exp, Log, Logl0, Round, Pow, Sign, Funciones trigonométricas y trigonométrieas inversas. Sin, Cos, Tan, Asia, Acos, Atan Atan 'M Fonciones trigonométricas hiperbélicas. Sinh, Cosh, Tanh + Mn er Mi Constantes. E, Pl. La sina npleada palmer ses fncons noha cambio con spect a Visa Base 6. La fui Log pee el ple dun agomentoGogaos nara) oe doscgunene Goran ‘cualquier base): we * : = (onsimesee + togastene natural do 20 console. weicecine iath-tog{10| « Soe Forane de cvahunt of logartono ducinal ae idea eS console iettavine (wath t2g(a000, 20) a's essle irieatinetbaeh tasion000)) | Ted ‘Los métodos Min y Max hacen lo que su nombre suger y se encuentran convenientementesobrecarga- dos para poder trabajar con cualquier tipo de valor: Consote.neteeLine at. Win{ 2.5 Console weiteLine ath Mer (@3, La fusin For devel er meg ie argument, mien ie Cen deve entero mayor o igual que el argumento: = “ Mnedevsheet congle-eittine natn. rsee 2.5) SAIC, ‘Atand calcula el éngulo con el que se ve un objeto de una determinade altura y situado una distancia ‘dada x; es similar @ Atan pero proporciona un valor dnico para cada uno de los cuatro cuadrantes. La Captle 3: Control de joy mane de eres 103 funcidn IEEEReminder cleus el resto de una division: por tanto, es similar al operador Mod pero funcio- na eorrectamente con cualuier nimero en punto flotante: Cconscle taiteLine Wath. IEEERenatnder 2, 1.51) seas Funciones de fecha y hora . La clase DateAndTime incluye varias funciones de fecha y hora, entre las que se encuentran DateAda, DateDiff, DatePat, DatSerial, DateValue, Year, Month, Day. Hour, Minute, Second, MonthName, Week= ay, WeekdayNume, TimeSerial y TimeValue. Esta clase expone dnicamente dos propiedades de slo Tectura: Now y Time. En general, la sinters noha cambiado con respecto a Visual Basic 6 salvo para las funciones Daiedd, DateDiffy DatePart que, en la actualidad, acepran una constante enumerada en lugar de una constance de cadens: ‘Ahora dispone de dos auevas propiedades para obtener y definir la fecha y Ia hora actuales: contigurae 1a hoca del siztana cone nedtansche: ‘Sralis lor diaz que quosen hasta el 2: de dicSantve del presente ato ‘bateSerial Year (Teday!, 12, 311) Estas propidades susttuyen a Time y Date, respectivamente, Las funciones MonthName y Weekday [Name peemitenel empleo de un argumento Boolean adicional para obtener el nombre abreviado del mes 0 el dia consoteteitetine Montitane(L, evel) ome Interaccién entre comandos y funciones La clase Microsoft VsualBasic Interaction cuenta con numeroses y ities eomandos y métodos que ya estaban disponible en Visul Basic 6 incluyendo: AppActivate, Beep, CallByName, Choose, Command, Environ, If, InputBox, MsgBox, Patton, Shell y Switch: y los métodos ceacionados con el registro DeleteSening, GetSerting, GetAllSetings y SaveSetting. Esos métodos se encuentran definidos de manera {slab po lo que no tended que incluir el nombre dela clase cvando ls wc. Sin embargo, las constantes felacionadas con estos métods se encuenran en una clase distintay deberdespecifica sos nombres com pletos agBox("Adidas, utcrosote,visualsaste kagaoustyie. informacion! ‘Cuando uslice estas funciones, resultard una buena idea importar el espacio de nombres de Micro- soft VisvaBasic a nivel proyecto para que pueda abreviar los nombres de las constanes (Jependiendo en ue proyecto lo haya creado, Visual Studio puede que agzegue una instracciéa Imports que apunte este espacio de nombres a nivel proyecto), SU NagBoxstyle. Quest fon Gr’ MegBaxstyle.YeeNe} Observe que el nombre de la constante es similar ala constante correspondiente de Visual Basic 6 pero sin el preio vb. OOS SOOBHHSOHHRHHBHVHHOHHHHHOHHHOHEHNOOE @ ‘ 8060800882068 089000 000009 000SERH8008 404 Programtén avanzada con Mieresot Visit Basic NET “La funci6a Shell se ha poteciado con respcto ala versién orginal y penmite el empleo de un srB sens dicot que le permite especiicar st desea espera aque termine el programa ject 6f une rare acre, cow una opeién de emp de espera mximo. Este tema resuelve un vtjo prbieria coon etichos programadores de Visal Base sin qu fenga qu recur als foncones de Wine ‘dows APL cemine de exabejar con € « njecuser ob 2 Sopntnseyie-sommirocus, 00) seed aotenes ioc 4 notas y esperar un ftino de 19 semsndoe Dam 27rares Et Seotepad”, Applinstyie.torealPocus, Tree, 10000) Feaotares = 0 Then, ga ha coccado of Bloc de satas en 10 sezundos.*) Console Weleetinel sigue on afecuctén después de 10 seguntos.”) bine congote.nrleeLine| ‘EL Bloc de notes ena if Otros comandos, funciones y objetos ales de archivos de Visual Basic, inclu- TrieCopy, FeDsteTime, FileLen, GetAte, Kill, MkDis, RmDir y ive entre sus hombiogos de versiones anteriores del lenguaje FileGer, FlePut, PratLine, InputLine e InputString int, Linelnputd e Input cuya sintaxis no La clase FileSystem incluye todos los eomandos yfunciones habit yyendo ChDir, ChDrive. CurDir, Dir, ‘etAttc. No existen diferencias significa Salvo que los nuevos comands FileOpen, ileClose, han sustiuido a las instucciones Opend, Closet, Geth, Put. Pr tetindar no estépeemitida en Visual Basic NET}: ibtGhneledor ne Enveger = Feeer{le0 SUSLERSIRETSSS OTe Apucoenec bats, openfoge.tneut, openacceas- Read) LIGPELE' Sontoniio dei arckivo en sa unica operecicn eee ees fica as string = inpuestringinanejedor, Cine(BOF anesadse!)/ Poytees el erenivs esieeieseinanejador) cevitar el empleo de estas funciones relacionadas con Basic y utilizar los objeto ofreidos por Sin embargo, en la mayorta de los casos deberd ‘consult el Capitulo 10 si desea Lrchivos pertenecientes al espacio de nombres Microsoft. Visual INET Framework porque de esta forma podeé esedibir digo ms flexible Gotener nds detalles sobre ls clases de archivo y directorio de NET). Trees Conversion proporciona soporte para cies funciones tals coo Fix, Hes, Int, Oct Sty Vat. quesigucs contetando el iglieao sais que tefan en Visual Bai 6 Esta cls ambience Hees Seeetascing, que coniere un efdigo de err en una descrpcion, La funcién ErmrToStng aaron er Description, pero oo necesita que se produzca un eror real para obtener It descrip sociada con un determinado c6digo de err: roe ae esstge $ vescra Le dasceiscién asociada con ol jotastentirteetine|ereoerostring(®)! Tait subindlce eaes fuera cet tn La clase Information reine fuciones diversas tales como Ea, Er, IsArray, IsDate IsEror.IsNohing na seeUpound, UBound y TypeName. Observe que no pod tz [a fncién Len para determinat deberd utilizar el como lo hacia en Visual Basic 6, En su lugat, Ta longitud en bytes de uns variable, al fe InteropServices Marsal: snétodo SizeOf de Ia clase System Runtime Ben 2 Me TOES unesne toteropservices tarsnal size06(00) ‘caiula 3: Contra de jay manejo ce erores 108, dato de Visual Basic al nombre correspondiente en conversin opuesta, Estas funciones pueden cesul- idades que convieran c6digo desde Visual Basic a La funcién SystemTypeName convient un tipo de INET, mientets que la funcién VbTypeName efectia la taritles cuando destrrolle generadores de ciao yu ‘otc Ienguale NET: consple.kesteLine Systentypetiane ("tong") > systen.atse SAS Meitecine typename (vavaven.snei6-1) * => SRO= La funcidn InReference devucive True siel argumento es un tipo por referencia, 0 False sis un tipo de valor ‘Las funcones IsEmpty ¢isNall no se pueden utizar en Visual Basic NET poraue sso tenfan sentido to podréuilizaren Visual Basic NET. Sin embargo, cevando se tilizaban argumentos de ipo Variant, que ide dato DBNall (que representa un valor nulo extraido de un INET Framework permite el empleo del tipo ‘Mipo de una base de toe) y Visual Basic NET expone convenientemente una funn ISDBNull que ene més o menos la misma uilidad que IsNull, ae ne Ts clase Financial implementa todas las foncione financieras habtuales de Visual Basic, incluyendo DDB. FY, [Pmt IRR, MIRR, NPer, NPV, PMT, PPMT, PV, Rae, Sin y Syd La clase Environment re varias propiedades y métodos que, inicialment, formaba parte del La clase System Environment expor jn relacionada con el sistema operativo, por ejemplo, el Tenguaje y que le permiticn acceder ala informact directorio actual moestea ef aicecrorio actual. MEE, fketine envionment Curencoirectory! anole io Posed ler variables de entoro (aunque no modificaras) de tres formas distntas + opeenee oh valor de una variable: Consslevticitetine(vusernane=" & ont ibSanent covenvdomeancVaviable ("USERNAME") + expande una cadena que contione Wwastapiest nub tag as sueing = "oPU 92 VOROCESscR LOVE! [PES eaeteton ov $990ESS0R REVISION” isonnent axpandanvironsancVartables (3231) consoles cpetene io 2iate de tolas lea variables de encorno y sus valores bin devas Dlctisearyaatey Bae ee te se Gn snes vannen cevtnelrannencVarsaDLes GSectol = (i), geckey, devalue! Pod recuperar I linea de comando del programa (que incluye et nom una cadena, w obtener una matrz de cadenas,enel que cada elemento es us re del archive ejecutable) como item de ls cadena de comandos: a Linea do comandos pasads a este prograna (Jnetuye sombre EXE) fee aavixonsent Comandline) 106 Programaciénavenaada con Microsoft Visual Bese ET tart goodness auntie ttcodcldog on in 26nen ce conan, Console.weicetingiarg) menos Varias palabras encerradas entre conillasdables se consideran como ui sideran como un tnico argumento de la linea de omandos. Por ejemplo, sélo se recuperarin dos argumentos cuando ejecute la aplicacignvilizande exe ‘comando en una ventana del simbolo del sistems: Mitel ‘primer arguresto ‘segundo argunento Por depurr una aplicacin de Visual Basie NET g : sie NET que acepte arguments en line de comandos ses IDE ns ae eco Ue de oan en pine Dp cate 2 loge nas de propedadet del proyecto, cua gus port nesta sn ts qu hear el comma Pres des del mend Proyecto, roves ere saves : no Prope También exien visits propedades que no extaba disponibles en Visual Basic 6 , Mamades una 0 mas funiones API de Windows, tales come el diecero el sites) canine) oe ‘memoria asignada al proceso actual: , sd ie 1 Bleectorto det sistana windows Console: Artteine pwreament:SystenDizeccory) "eroria Fisica asignaca oi présesa acvant console tedtetine(envisoment wortioasse) La propiedad OS Version devuelve un objeto OperatingSystem que, su vez, ex cone apieind OSVer bjeto OperatingSystem que, a su ver, expone propiedades tales ‘ontcle eiseinemvitoneneosvrsionPlattom) + 2 Piateforea = 2 significa windows HE/2000 (Consoie Weitetine(ineironnent cSversion,Varsion) «> $.9.2395.0 ro principal de version = 5 significa Mindows 2030 La propiedad Version proporciona la vers del runtime del lenguaje comén an pi ein prom =! runtime del lenguaje combn bajo la que se estéejecu- 5 Biscute asta eddics on la vaceLin beta Release candica Consoie telecine’ "Cansen Tanpoaseseaetee sens (te prope even el sobre del asi que ha ncn inicio el preset sabres, ome el doi de et asia co luo sete sombre dl NETBIOS 0d are " {NOHEEAE {nfornactén sobee ol usuario actual. onsole.edeat nel EnvizommetUaectane) ‘MeLeetine|“Wishinedine = (0}%, dnvisonmant Rachinalons) | Finalmente, e! método Exit le permite salir de la apliacion acwal y devolver un eédigo de error at Skisina operativo, Este méado Ie resultré especialmente il en programas de consla cuyo principal objetiva es ser ejecutados desde la linea de comandos y desde archives de proceso por tes, Eevironmenc eae(ay er} ES MANEJO DE ERRORES Durante afios, os programadores de Visual Basic han ara e lores de Visual Basic han atrapado los erores utilzando la honradisime, {ue limited, instcci6n On Eror en sus dos variantes: On Error GoTo y On Error Resume Next View al Captlo 3: Conta! de uo y manejo de eres 107 Basic NET permite el empleo de estas dos instruceiones, aunque Microsoft desaconseja enearecidamente su empleo a favor dela novedosa insruceién Try .Catch..Finally Control de excepciones El problema principal eon la forma tradicional de contolar Tos errors bajo Windows es que nd existe una téenica con I que todo ol mundo esté de acverdo. Por ejemplo, las funeiones de Ia mayoria de las DLL Cincloyendo las DLL del sistema Windows) informan de los ervores devolviendo un valor y relizan esta ‘operacién de una forma bastante confuss. En algunos casos, 0 significa &xitoy 1 sigifie ero, aunque en ‘tro 80s, l significado es el inverso Los componentes COM devuelven un eédigo de err utilizando un valor HRESULT de 32 bitsy las aplicaciones de Visual Base provocan errores wtlzando entre basidoces ‘un mecarismo compatible con COM. Otros lenguaes, tales como C++ y Jova, pueden utilizar un mecanis- ‘mo de Conttol de ertores basado en excepciones Para permtir la interoperabilidad enue lenguajes. cl NET Framework ha nomatizado un método dno de provosaryatrapar errores basados en excepciones. Puede pensar que las excepciones son condiciones no esperadas qe ocurren durante la ejecuign desu plicaign o cuando el eédigo se est ejecutando denro del propio NET Framework. Cuando se produce esa situaciGn, se dice que el e6dig inicia una excepeién {ue se espera que otro cbdigo sea capaz de capurar. Ls excepciones pueden ser capturadas pore cédigoexistete dentro del mismo procedimento en el, (ue se produce el error. Si no es ast, I excepcién se comunica al llamador y serd tarea del llamador remediar el error y, posiblemente, reintentar I operacin que provocs el funcionamiento err6neo. Si et TTamador no puede atrapr la excepcisa, la excepeién se envard avtométicameate al lamador det llamador. Laexcepciéa «burbujes hacia aria po a cadena de lamadas hata que se localiza un procedimiento que consiga eaptuaria (en breve, explicaré qué significa en la prdctica eapurat una excepcisn). De forma predeterminads, sina existe un procedimiento en la cadena de lamadas que pueda captrar la excepeiGn, el ‘usuario final serénotificado mediante un cuadro de didlogo de error, similar al mostrado en la Figura 3-1 Podiré modifica a forma en que se comportar el runtime del lenguaje comin cvando se ha producigo una «excepcién que no ha podido ser eapturada. Para ello tend que modificarel valor Dbg]ITDebugLaunch- Setting contenido en la clave HKEY_LOCAL, MACHINE SSoftvare\Mierosoft. NETFramework del Re- Figura 3-4, Cuacro de ditog de error que parte cvando se han insaado ene equipo uno o mds dpuradores ET. 0280S 008 HOHOTHHBNGHTHHHHHOHOHOHHHOO'OS 2086 S888 O68OO1HGOOTOHGHOHOHODHOOOCE | 108 Programacion avanzada con Mleosoft Viual Basic.NET ists, De forma predeterminada, este valor es 0, lo que provoca la aparicin del cuadro de dislogo de exo; Hiistgna el valor la esta clave a aplicacign finlizard, mientras que el valor 2 ejecutaré el depurador. La rose infer una excepciOn resulta bastante apropiada porque, en realidad, cuando se produce la ‘excepeign se tansmite al llamagor un objeto Exception. El cigo que captura la excepeién puede exami- nat as propiedades del abjeto Exception, invoear sus métodos y eecutar os pasos que consdere necesarios {por ejemplo informar al usuacioo cancelar de manera slencioss la operacidn que ha provocedo el proble- tha) Como altemativa, el e6digo puede iniciar de quevo el objeto Exception (posiblemente, después de ajustar una o mis de sus propiedades) o puede inciar un objeto Exception completamente dstnto para nvidrselo a su propio lamador. ‘El objeto Exception enviado expone propiedades, tales como Message (la descripcin del eror), Source (una cadena que dice dénde se ha producido el error) y HelpLink (le posicién de una pégina de ayuda que Aeseribe cdmo recuperarse del eon), La siguiente seccién describe estas propiedades en mayor detalle ‘Si piensa que todo esto le resulta familiar, estard en lo cierto. Incluso, aunque los detalles interns som diferentes, las excepciones de .NET funcionan y se comportan de la misma forma en que lo hace el meca- rismo de contol de errores de Visual Basic, El objeto Exception se parece al objeto Err (con nombres Giferentes para sus propledades) nicar una excepcidntabsja de forma sorpeendente parecida & provocar luz error, el comportamiento «burbujeante» es aquel que utiliza Visual Basic 6 cuando notfica procedi Inicntos de enor i dichos procedimientos no disponen de un controlador de eror activo. Pare los progra- ‘adores en Visual Basic se trata de territoro conocido. El objeto Exception El objeto Exception se encuentra definido en NET Framework y su nombre completo es System.Excep- tion, Sin embargo, ni las clases NET ni sus propia aplicaciones sueleniniciar este extrafo objeto de ‘excepcion. El marco de trabajo define otras dos clases genéicas, System-SystemException y System. Ap- plication xception: casi todos los objtos Exception definids en NET Framework heredan de SystemEs~ Eeption. mientras que fos objetos de excepcisn personaizados y especificos de cada apicaciOn heredan de ‘ApplcationException. Esta dos clases no agregan niaguna propiedad o metodo «la clase base Exception, pera ofrecen una forma bastante eficaz de clasficar las excepciones. La Tabla 3-1 lista aigunos de los objetos de excepeién del sistema més frecuentes. Por ejemplo, las ‘operaciones mnatemsieas pueden iniciar un objeto ArithmetcException o DivideByZeroException, mien- ties que las funciones pueden iniciar un objeto ArgumencOutOrRangeException. Para obtener wna lista completa de los objetos excepcién podeé wilizar el comando de bisqueda del Exarsnador de objetos y buscar la subcadena Exception, Tabla 4, Algunas de las cases Exception en los espacias de nombres mas importantes de NET Framework Espacos de nombre ‘Clases de excepibn ‘ArgurentNullExcepion, ArgumewOuOTRangeE ception, Sym Divide ZemExcepin, LodexOutOFRangeE ception, NullRefrence-Excepion, OvertiowException, SackOverRowEscepion System 10 DirecoyNofFoundEscepion. EndOrSucamEscepton, FileNotPoundEception, PadTooLongException System Data DoplisteNanc Exception, lnvalléConstaiExcepion InvaldExpresionEscepton, MisingPrimaryKey Exception NoNullAllonedéxcepio, ReasOnlyExcepton ‘System Runtime teropServiees InvalComObjestExceptio,lavaisOleVarianTypetcepton, SEHExcepion Captule 3: Conta de tua y mangjo de erores 109 ‘A continaaciGn, anclizaremos las propiedades y métodos més importantes que todos estos objetos cexcepcin tienen en comin (observe que todas las propiedades son de sGlo leetura excepto Source y Help Link), La propiedad Message es el texto descriptivo de la excepcidn y, por tanto, es similar ala propiedad En: Description, Por ejemplo, la propiedad Message de DivideByZerotxception devuelve Ie cadena «ln- tent de dividir por cero» "Bl abjeto Exception heeda la propiedad ToString de System.Object y devuelve el mismo mensaje de ceor que se mosiraré al usuario final en un cuadro de dilogo. Es similar ala propiedad Message, pero {ncluyetambign el nombre del médulo, Si se ha incrustado informacin de depuraci6n enelejecutable, esta propiedad también devolveré el nombre del procedimiento y el nimero exacto de nea en In qué s© ha produc el eror: Sytten.oividesyzerateception: intento 8 dividis pos osrs, aU aipplicacion font sesteooe in e:\Maapticacion\ Foret vb:lice 70 La propiedad TargetSite devuelve el nombeey Ia firma del procedimiento en la que se produjo por primera ver la excepcisn, expresado en sintaxis Ct La propiedad StackTrace devuelve una cadena gue describe la ruta de la pila desde el lugar en que se _generdoriginalmente la excepeiGn (es deci, donde se produjo el error) asta e lugar en el que se capturé el, ‘Ero. Por ejemplo, supongamios que el procedimiento ProbarProc lla al procedimiento EvalResult que, 8 Su vez Tama a la funcidn DivisionNumeros y suponga que Ios dos dltimos procedimientos no capturan ‘excepciones. Sila funcidn DivisionNumeros més inter genera una excepcisn DivideByZeroException, el ‘alot de la propiedad StackTrace, tal y como se lee en el procedimiento ProbarProc, tended un aspecto similar al oBdigo siguiente ae niaptleacion. fora! Divistonmuneroa{ 18032 X, Int32 yi Uh crituapiseacion\roret vs:line 3 cat mippticatign.fornd evaieeast |) te Capt icuelon\Fomi-vo:tine 37 spl carton: Format Peasacescel) in C:\WiApLicacion\Poral.vbs line 77 Pero slo obtende esta informacién detallads si el ejecutable contieneinformaciéa de depuracién: si he ccompilado el programa en modo Release, no vers el sombre del archivo origen ni el niimero de lines. No hace falta decir que la propiedad StackTrace seri su mejor altado cuando est itentando averiguar lo que ha ocurido realmente cuando su e6digo genera un excepcién. ‘La propiedad Source define o devvelve el nombre del componente en el que se generé ln excepcin y. por tant, es similar ala propiedad Err Source, Para las excepciones generadss en la aplicacin actual, esta propiedad devuelve una cadena nula. a propieded HeipLink define o devuelve un Nombre Uniforme de Recursos (URN) 0 Localizador ‘Uniforme de Recursos (URL) al archivo de ayuda asociado con el objeto Exception, como puede ver a La instruccién Try...Catch...Finally [Anteiormente hemos visto cfm funciona el mecanisino de inicio de excepeiones y qué tipo de informa- ign transport un objeto Exception, Aor estaré preparado para apreciarpfenamente 1a potencia Is fenbilided del nuevo blogue Try..Catch..Finally La palabra clave Catch Siempre que ejecute o6digo que pueda iniciar una excepoin deberé encerarto en un bloque Try nd Ty Bl ebdigo que se encuentre entre Ia palabra clave Try y la primera palabra clave Catch estact

You might also like