2010-03-10 15 views
5
var trimmed = myStringArray.Select(s => s.Substring(0, 10)); 

Si una de las cadenas no tiene 10 caracteres, obtendría una ArgumentOutOfRangeException.LINQ Iterator Exception Handling

En este caso su bastante trivial para descubrir y sé que puedo hacer

s.Substring(0, Math.Min(10, s.Length)) 

Con errores de construcción de objetos más complejos como esto no siempre son fáciles de ver sin embargo. ¿Hay alguna manera de ver qué cadena no fue lo suficientemente larga mediante el manejo de excepciones?

Respuesta

2

Cree un método que realice la transformación compleja que puede generar excepciones y llamarlo desde la lambda. p.ej. .select (s => complexMethod (s))

string complexMethod(string s) 
{ 
    try 
    { 
    ... 
    return ... 
    } 
    catch 
    ... 
} 

Ahora se puede registrar la excepción dentro del bloque catch antes de volver a lanzar, o utilizar Exception.Data para añadir información a que antes de volver a lanzar, o una envoltura en una excepción personalizada con la información que necesita. Recuerda usar solo 'throw' cuando lo vuelvas a lanzar si no es una excepción personalizada.

También se puede poner en línea el cuerpo del método en el lambda: .Select(s => { ... return ...})

+0

Estaba usando la sintaxis de bloque de método en otra cosa ayer y ni siquiera hacer la conexión. ¡Gracias! – kwcto

0

Mientras no lo use con LinqToSQL o EF, puede crear su propio método de extensión que envuelva la excepción y le indique el valor de la cadena.

0

En este caso, una cláusula WHERE puede ser apropiado para filtrar la longitud que usted está buscando:

var trimmed = myStringArray 
     .Where(s => s.Length >= 10) 
     .Select(s => s.Substring(0, 10)); 

EDITAR
Sólo volver a leer la pregunta se dio cuenta el PO está buscando el manejo de excepciones para ver qué cadenas no fueron lo suficientemente largas. Suponiendo que no le importa qué cadenas son lo suficientemente largas, entonces la solución provista funcionará.