Aquí podría ser tu PUBLICIDAD


Alertar a los usuarios de la biblioteca a un estado inconsistente

votos
3

En un contenedor administrado sobre una biblioteca nativa, tengo que realizar ciertas operaciones que para el usuario de los objetos de alto nivel se deben considerar atómicas y consistentes. Sin embargo, las operaciones subyacentes en el código nativo son atómicas y consistentes individualmente, pero no como un todo.

// Simplistic look at the AddRange operation
void AddRange(IEnumerable<ChildType> range)
{
    foreach (var value in range)
    {
        this.NativeAdd(value);
    }
}

// Simplistic look at the Delete operation
void Delete(ParentType value)
{
    foreach (var child in value.Children)
    {
        this.NativeDelete(child);
    }

    this.NativeDelete(value);
}

Todas las operaciones nativas fallan con un tipo de excepción común si el código nativo se relaciona con un error:

void NativeDelete(ChildType child)
{
    StatusCode status = StatusCode.NoError;
    NativeMethods.DeleteChild(this.id, child.Id, out status);

    if (status != StatusCode.NoError)
    {
        throw new LibraryException(this, child, status);
    }
}

En las rutinas AddRange y Delete de alto nivel me encuentro con la situación en la que algunas de las llamadas nativas Agregar o Eliminar se han completado, pero se produce un error en una de ellas y el resto no se completa.

ACTUALIZACIÓN: el archivo real en el disco, para un usuario, no se verá diferente si agregaron 7 elementos y falló en el 7º elemento, o si agregaron 6 elementos con éxito. La única vez que se registra el error es durante el tiempo de ejecución. Por lo tanto, si el usuario no tiene conocimiento de la posibilidad de un estado incoherente, es posible que no pueda decidir si el archivo subyacente es válido.

Debería:

  1. Deje la excepción LibraryException y proporcione documentación al usuario de que el objeto ParentType o ChildType puede estar en un estado incoherente
  2. Ajustar la excepción LibraryException en una InconsistentStateException que contiene información sobre qué objetos pueden estar en un estado incoherente
  3. Capture LibraryException e intente restituir manualmente los cambios realizados, antes de volver a lanzar la excepción para el usuario (no es fan de esto)
  4. ¿Algo más?
Publicado el 12/03/2009 a las 19:40
fuente por usuario user7116
En otros idiomas...        العربية       

3 respuestas

votos
2

3 simplemente no es posible sin un verdadero soporte de confirmación en dos fases (es decir, un administrador de transacciones). Retroceder con la mano solo te conducirá a un estado más inconsistente si ocurre un error allí.

Creo que 2 es redundante. Si llama a un método en el tipo principal (que es donde se exponen estos métodos) y tiene una excepción que se produce cuando lanza esa excepción, se supone que el estado en el objeto está dañado (con la excepción de unas pocas excepciones) . Generalmente, cuando eso ocurre, no se puede hacer mucho con el objeto, excepto tirarlo y usar uno nuevo con un estado consistente.

Eso deja 1, para documentarlo. Si bien puede dar mucha información estructurada en 2, si el objeto está en un estado incoherente, realmente no desea tratar de arreglar ese estado, ya que corre un mayor riesgo de atornillarlo más.

Respondida el 12/03/2009 a las 07:52
fuente por usuario casperOne


Aquí podría ser tu PUBLICIDAD


votos
1

Si entiendo su actualización correctamente, todo lo que la persona que llama puede hacer es pasar la información al usuario final, quien debe decidir si acepta el estado o si retrocede.

En ese caso, (2): proporcione toda la información para que la persona que llama pueda pasar la información al usuario, o un archivo de registro, o algunas estadísticas sin mucho trabajo.

(1) estaría bien si no hay diferencia informativa para (2), por ejemplo, saber qué elemento falló es irrelevante.

(3) no tiene sentido si no puede esperar arreglarlo la mayor parte del tiempo, y peligroso si hay la menor posibilidad de empeorarlo.

Dependiendo del tamaño del archivo, es posible que pueda realizar el cambio casi atómico trabajando en una copia. Al menos, el usuario probablemente esperaría una forma fácil de retroceder al último guardado.

Respondida el 12/03/2009 a las 10:18
fuente por usuario peterchen

votos
1

Me gusta tu segunda opción -

Esto proporcionaría una excepción mucho más significativa, que controlarías. No hay ninguna razón para obligar a los usuarios finales a comprender algunos códigos de estado extraños, etc. Al menos de esta manera, será obvio lo que sucedió y por qué.

Respondida el 12/03/2009 a las 07:46
fuente por usuario Reed Copsey