2010-11-28 5 views
3

J'essaie de gérer le cas où une image que je cherche n'existe pas - elle devrait par défaut à une image stock-icône.Silverlight/C# image non trouvé gestion des exceptions

-à-dire: - quand sampleImage = http://www.google.com/images/logos/ps_logo2.png (existe - il devrait revenir fin) - quand sampleImage = http://www.thisimagedoesnotexist.com/something.png (n'existe pas - il faut aller dans le bloc catch)

Ci-dessous est mon code i J'utilise - cependant ne va jamais dans le bloc catch quand l'image n'existe pas. Je suis ici dans une application Silverlight. Des sugestions sur comment je peux faire fonctionner ça?

try 
      { 
       image.Source = new BitmapImage(new Uri(sampleimage, UriKind.Absolute)); 
      } 
      catch (OutOfMemoryException) 
      { 
       sampleimage = "defaulticon.jpg"; 
       image.Source = new BitmapImage(new Uri(sampleimage, UriKind.Absolute)); 
      } 
+0

Ajout d'un nouveau code, s'il vous plaît essayer une fois de – TalentTuner

Répondre

3

essayer ci-dessous le code

CODE AJOUTÉE POUR URL MANIPULATION INTROUVABLE

 Image image = new Image(); 
     string sampleimage = "http://www.google.com/images/logos/ps_logo2.png"; 

     Uri address; 

     if (TryGetUriAddress(out address, sampleimage)) 
     { 
      image.Source = new BitmapImage(address); 

     } 
     else 
     { 
      sampleimage = "defaulticon.jpg"; 
      image.Source = new BitmapImage(new Uri(sampleimage, UriKind.Absolute)); 
     } 



private bool TryGetUriAddress(out Uri validAddress,string addressToCreate) 
    { 
     bool isValid = false; 
     validAddress = null; 
     try 
     { 

      WebClient sc = new WebClient(); 
      sc.DownloadData(addressToCreate); 
      validAddress = new Uri(addressToCreate, UriKind.Absolute); 
      isValid = true; 
     } 
     catch (Exception ex) 
     { 
      isValid = false; 
     } 

     return isValid; 
    } 
+0

Merci pour votre réponse. J'ai lu que OutOfMemoryException est l'exception thworn lorsqu'une image (en utilisant BitmapImage) est introuvable. – Simba

+0

Mise à jour: avec le bloc de code ci-dessus vous avez fourni, il ne fonctionne toujours pas :( – Simba

+0

Merci encore - j'ai essayé ci-dessus code et obtenu ci-dessous l'exception – Simba

1

J'attends la solution de Saurabh à travailler. Je ne fais que proposer une alternative pour votre approche. Avant de créer BitmapImage, essayez d'obtenir un URI valide, puis passez-le au constructeur BitmapImage.

Uri sampleURI; 
try{ 
sampleURI = new Uri(sampleUriPath,UriKind.Absolute); 
}catch(UriFormatException ufex) 
{ 
sampleURI = new Uri(defaultUriPath,UriKind.Absolute); 
} 
image.Source = new BitmapImage(sampleURI); 
+0

Le paramètre defaultUriPath ne sera utilisé que si sampleUriPath n'a pas été analysé comme un uri. Il peut encore s'agir de déchets pour toutes sortes d'autres raisons, comme le nom d'hôte n'existe pas ou la ressource n'existe pas, simplement construire un objet Uri ne teste aucune de ces conditions. Le type Uri est juste une façon plus structurée de gérer une chaîne Uri. – AnthonyWJones

1

La bonne façon de gérer cela est d'utiliser l'événement ImageFailed: -

bool defaultAssigned = false; 
Image image = new Image(); 
image.ImageFailed += (s, args) => 
{ 
    if (!defaultAssigned) 
    { 
     image.Source = new BitmapImage(defaultImageUri); 
     bDefaultAssigned = true; 
    } 
} 
image.Source = new BitmapImage(sampleImageUri); 
+0

Salut Anthony - merci pour la réponse. Cela ne marche pas non plus dans mon projet Silverlight :(Notez que l'image à laquelle j'essaye d'accéder est une image via http: // (pas sur le système de fichiers) Et ce qui précède ne pénètre jamais dans le bloc ImageFailed même si l'image est – Simba

+0

@Simba: vous ajoutez réellement l'image à l'arbre visuel à un moment donné Silverlight n'essaiera pas d'aller chercher l'image jusqu'à ce que vous le fassiez Je vous suggère d'utiliser un outil comme Fiddler pour regarder ce qui est réellement étant envoyé et reçu entre le client et le serveur – AnthonyWJones

+0

Je n'ai jamais été en mesure de déclencher l'événement ImageFailed Voir cette question: http://stackoverflow.com/questions/3760690/handling-image-load-exception-gracefully. Je pense qu'il y a un bug SL ici quelque part. –