c# - seguir - no me funcionan los hashtags en instagram 2018
¿Por qué C no tiene soporte para el filtrado de excepción de primer paso? (6)
Con respecto a la primera pregunta, si había una declaración pública, entonces era más que probable que se pusiera en la web en algún lugar, en cuyo caso, Google debería mostrar algo (si existe).
Si se trata de un correo electrónico directo con el equipo C #, entonces es más que probable que esté bajo NDA, por lo que no podría publicarse de todos modos.
Con la segunda pregunta, hay una capacidad de búsqueda en Microsoft Connect que le solicitan que use antes de ingresar una nueva sugerencia. Si no puede encontrarlo, entonces probablemente no haya ninguno.
Mi recomendación sería poner una sugerencia y luego promoverla para que otros la evalúen.
Nota: esto no es un duplicado de la pregunta de Jeff .
Esa pregunta preguntó "¿Es un equivalente?" ¡Sé que no, y quiero saber por qué!
La razón por la que pregunto es que acabo de aclarar qué tan importante es, y la conclusión me parece muy extraña.
El bloque de manejo de excepciones de la biblioteca Enterprise de Microsoft nos aconseja usar este patrón:
catch (Exception x)
{
if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
throw;
// recover from x somehow
}
La política se define en un archivo XML, lo que significa que si un cliente tiene un problema, podemos modificar la política para ayudar a rastrear (o quizás empapelar) el problema para darles una resolución rápida hasta que lo solucionemos adecuadamente - lo que puede implicar discutir con terceros, sobre de quién es la culpa.
Esto es básicamente un reconocimiento del simple hecho de que en aplicaciones reales el número de tipos de excepción y su estado de "recuperabilidad" es prácticamente imposible de gestionar sin una instalación como esta.
Mientras tanto, el equipo de CLR en MS dice que esto no es una opción, ¡y resulta que esos muchachos saben de lo que están hablando! El problema es que justo antes de que se ejecute el bloque catch
, se ejecutarán todos los bloques finally
anidados dentro del bloque try
. Entonces esos bloques finally
pueden hacer cualquiera de los siguientes:
- Modifique inofensivamente el estado del programa (phew, lucky).
- Basura algo importante en los datos del cliente, porque el estado del programa está atornillado hasta un grado desconocido.
- Disfrazar o destruir evidencia importante de que necesitamos diagnosticar un problema, especialmente si estamos hablando de llamadas al código nativo.
- Lanza otra excepción, que se suma a la confusión general y la miseria.
Tenga en cuenta que la instrucción using
y los destructores C ++ / CLI se crean en try
/ finally
, por lo que también se ven afectados.
Entonces, claramente el patrón de catch
/ throw
para filtrar excepciones no es bueno. Lo que realmente se necesita es una forma de filtrar las excepciones, a través de una política, sin atraparlas realmente y desencadenar así la ejecución de los bloques finally
, a menos que encontremos una política que nos diga que la excepción es segura para recuperarse.
El equipo de CLR blogueó sobre esto recientemente:
- Atrapar, Retirar y Filtrar - ¿Por qué debería importarme?
- Por qué la captura (Excepción) / captura vacía es mala
El resultado es que tenemos que escribir una función auxiliar en VB.NET para permitirnos acceder a esta capacidad vital desde C #. La gran pista de que hay un problema es que hay un código en el BCL que hace esto. Mucha gente ha blogueado sobre hacerlo, pero rara vez o nunca mencionan lo de los bloques try
/ finally
, que es el asesino.
Lo que me gustaría saber es:
- ¿Hay alguna declaración pública o correo electrónico directo que las personas hayan recibido del equipo de C # sobre este tema?
- ¿Hay alguna sugerencia de Microsoft Connect que lo solicite? He escuchado rumores sobre ellos, pero ninguna de las palabras clave probables arrojó algo.
Actualización: como se indicó anteriormente, ya he buscado en Microsoft Connect sin encontrar nada. También (sin sorpresas) busqué en Google. Solo he encontrado personas que explican por qué necesitan esta característica , o señalan sus ventajas en VB.NET , o esperan infructuosamente que se agregará en una versión futura de C # , o que trabajan en torno a ella , y un montón de consejos engañosos. . Pero no hay ninguna declaración sobre la justificación para omitirlo de todas las versiones actuales de C #. Y la razón por la que pregunto sobre los problemas existentes de Connect es que (a) no creo un duplicado innecesario y (b) puedo decirles a las personas interesadas si tengo que crear uno.
Actualización 2: Encontré una interesante publicación de blog antigua de Eric Gunnerson , anteriormente del equipo de C #:
"Sí, ser capaz de poner una condición en una captura es algo más conveniente que tener que escribir la prueba tú mismo, pero realmente no te permite hacer nada nuevo".
¡Esa fue la misma suposición que tuve hasta que me la explicaron correctamente!
En cuanto a cualquier error de conexión existente. El siguiente problema trata con los fliters de excepción. El usuario no indicó explícitamente que deseaba que fuera un filtro real en el sentido de cuándo se ejecutan, pero en mi humilde opinión está implícito en la lógica.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=401668
Además de ese problema, no hay problemas que pueda encontrar o saber que estén relacionados con lo que estás buscando. Creo que sería bueno tener un problema por separado que explique explícitamente la necesidad de filtros de excepción de estilo VB.Net.
No me preocuparía demasiado por introducir una pregunta duplicada si ha hecho un poco de diligencia debida buscando una existente. Si hay un engañado, Mads lo engañará en consecuencia y lo vinculará con la solicitud principal.
En cuanto a la parte de obtener una respuesta oficial del equipo de C #, es probable que la recibas cuando: 1) presentas un error de conexión o 2) te engañan contra el error principal. Realmente dudo que haya una razón / justificación oficial por el momento.
Aquí está mi especulación sobre el tema: mi suposición es que esta característica simplemente no estaba en el conjunto de características original C # 1.0 y desde ese momento no ha habido suficiente demanda para hacerlo en el idioma. El equipo C # y VB gasta una increíble cantidad de funciones de lenguaje de clasificación de tiempo al inicio de cada ciclo de navegación. Tenemos que hacer algunos cortes muy difíciles a veces. Sin una demanda suficiente, hay muy pocas posibilidades de que una característica llegue al idioma.
Hasta hace poco, apostaba que sería difícil encontrar 1 de cada 10 personas que entendieran la diferencia entre Try / When de VB.Net y simplemente usar una antigua declaración if simple en un bloque catch de C #. Parece ser un poco más en las mentes de las personas últimamente, así que tal vez lo convertirá en una versión futura del lenguaje.
No creo que Java tenga una opción de filtro tampoco. Adivinando que si lo hiciera, también veríamos uno en C #. VB.net probablemente tenga uno por casualidad dado que el equipo de VB comenzó con una borrón y cuenta nueva.
Una cosa que podría funcionar a su favor en cuanto a obtener esta opción en una versión futura de C # es el objetivo declarado de Microsoft de mantener la paridad entre las características del lenguaje en las versiones futuras de C # y VB.net. Yo presentaría mi argumento basado en eso.
http://www.chriseargle.com/post/2009/01/Parity-Between-Languages.aspx
Puedo pensar en al menos dos razones por las cuales el filtrado de excepciones está ausente de C #
- Permitir filtros de excepción puede alentar a los programadores a hacer cosas durante el manejo de excepciones de primer paso que no sería seguro en ese momento, aunque podrían realizarse de forma segura dentro de un ''catch'' o ''finally''. Por ejemplo, si el código dentro del bloque "try" adquiere un bloqueo y lanza una excepción mientras se mantiene el bloqueo, el bloqueo se mantendrá durante la ejecución de los filtros de excepción externos, pero se liberará antes de un "catch" o "finally" externo "bloque se ejecuta. Además, al menos la última vez que verifiqué, las excepciones que ocurrieron dentro de un filtro de excepción y que no fueron capturadas quedaron silenciadas silenciosamente, algo así como una situación desagradable.
- Los implementadores de C # tienen una visión de hacer que su lenguaje sea ''agnóstico en el marco''. Si C # admitía el filtrado de excepción de primer paso de .net, los programas que usaban esa característica podrían no ser utilizables en marcos que manejan las excepciones de manera diferente. Esta es la misma razón por la que C # prohíbe a los programas sobrescribir `Object.Finalize ()`. Mientras que el razonamiento que rodea `Object.Finalize ()` es defectuoso (el uso correcto de destructores requiere el uso de otros métodos específicos de la plataforma, por lo que requerir el uso de la sintaxis del destructor para `Object.Finalize ()` no logra nada excepto t77o fomentar la escritura de software defectuoso) el razonamiento tiene algún sentido con respecto a los filtros de excepciones. Por otro lado, la forma adecuada de tratar con ese problema sería exponer algunas características relacionadas con el filtro de excepciones, incluso si no se exponían los filtros de excepciones directamente.
Una característica que realmente me gustaría ver en C # y vb, que requeriría el uso de filtros de excepción para implementar, pero que no requeriría exponerlos directamente, sería un parámetro de Exception
opcional para un bloque finally
. Este parámetro sería null
si no se produce una excepción no detectada; de lo contrario, tendría la excepción en cuestión. Esto permitiría situaciones en las que un programa querrá hacer algo cuando ocurra una excepción, pero no realmente "manejarlo". En la mayoría de los casos, el parámetro Exception
no se usaría para nada excepto para verificar null
(lo que significa que la función sería equivalente a exponer bloques de fault
), pero ofrecería ventajas en los casos en que ocurra una excepción durante la limpieza. En la actualidad, si se produce una excepción durante un bloqueo finally
, es necesario sofocar la excepción finally
-block o sobreescribir el preexistente. Tener la excepción anterior disponible para el código de bloque finally
lo habilitaría para envolverlo o registrarlo.
Tal como los entiendo, en el momento del rebrote, los ejecutores finalmente en las funciones internas se ejecutan y eso es lo que crea problemas para usted.
Pero supongamos que tiene un filtro de excepciones que pasa la excepción sin volver a lanzarla. Todavía tendrá que manejarlo de alguna manera en alguna parte, y se ejecutará en la misma clase de problemas (finalmente efectos) allí.
Así que, a menos que no esté entendiendo bien algo, no hay una gran ganancia al tener filtros de excepciones compatibles con el lenguaje.
Usar Exception Filter Inject puede ser más simple que utilizar la solución alternativa de delegado.
Para una respuesta real a su pregunta, necesitará una respuesta de Anders Hejlsberg, o de alguien que estuvo en las reuniones de diseño originales. Puede intentar ver si el entrevistador del Canal 9 puede preguntarlo la próxima vez que se entreviste al equipo de diseño de C # .
Supongo que cuando se tomó la decisión original, los filtros de excepción fueron vistos como una complicación innecesaria que podría causar más daño que beneficio. Ciertamente puede ver el deseo de permanecer "en silencio" sobre las características no probadas en esta entrevista sobre la decisión de no respaldar las excepciones marcadas: El problema con las excepciones controladas.
Creo que los escenarios de diagnóstico postmoterm argumentan fuertemente para proporcionar acceso a filtros de excepción en el idioma. Sin embargo, esos escenarios pueden no haber sido articulados en ese momento. Además, esos escenarios realmente necesitan un soporte de herramientas adecuado, que ciertamente no estaba disponible en V1. Finalmente, puede haber grandes aspectos negativos sobre la adición de esta función que no estamos considerando.
Si no hay un error de conexión en esto, debe ingresar uno y alentar a otros a votarlo. [Recomiendo pedir acceso a la función CLR en lugar de intentar diseñar cómo encaja en el idioma].