développement iPhone: Comment Attraper une Exception/NSError en Objective-C?
Je veux que mon application ne jamais simplement écraser bêtement. Je sais que la qualité du code est la racine de solution pour cela. Mais j'ai encore besoin d'une application à ne jamais bloquer lorsque certains bug inattendu se produit. Voici le code, je veux essayer.
-(void)testException
{
@try
{
NSString* str;
[str release];
}
@catch(NSException* ex)
{
NSLog(@"Bug captured");
}
}
Je sais que cela ne marche pas. Parce que release
jamais lever une exception. Voici mes questions:
- Comment faire pour atteindre cet objectif, le bug sera capturé, pas de plantage?
- Comment puis-je savoir quel système de bibliothèque raise exception et donc, je peux écrire un peu de code et de savoir que cela fonctionne?
Voici ce que j'ai lu
- un. Exception des Sujets de Programmation pour
Cacao - b. Gestion Des Erreurs De Programmation
Guide Pour Le Cacao
Je viens à partir d'une expérience de Microsoft programmeur contexte dans lequel les captures d'exception ou de l'exception inattendue toujours prévenir mon programme à partir de la plante dans un très mauvais environnement.
Comment avez-vous les gars et les filles (Mac genius programmeurs) faire crash programmes gratuits qui s'est passé? Partagez votre expérience.
OriginalL'auteur | 2009-07-31
Vous devez vous connecter pour publier un commentaire.
Objective-C est un non géré d'exécution; le code que vous compilez s'exécute directement sur le CPU plutôt que dans une machine virtuelle. Cela signifie que vous n'avez pas le contrôle de la couche qui peuvent piéger chaque mode de défaillance de la façon dont vous le faire lors de l'exécution dans le .NET VM ou de la JVM. Le long et court, c'est que la seule façon que vous allez être complètement sûr qu'un programme ne peut pas tomber en panne est du code très soigneusement et de le tester à fond. Et même alors, vous n'êtes pas sûr, vous pensez juste que vous êtes.
La dernière version de Xcode intègre le Cliquetis analyseur statique ('Construire et Analyser' dans le menu de construction) qui peuvent identité de certaines classes d'éventuels bugs -- je suis assez sûr que ce serait drapeau de votre exemple ci-dessus, par exemple). Mais il n'y a pas de solution miracle ici, la seule solution est de travailler dur.
OriginalL'auteur Skirwan
Test Test Test Test Test
Vous pouvez passer toute la journée à la rédaction d'exception-le code de gestion des exceptions possibles (qui dans la pratique n'arrivera jamais), ou vous pouvez créer approfondie des suites de test et écrire uniquement des gestionnaires d'exception pour les situations qui se présentent dans la pratique.
C'est pourquoi je n'ai presque jamais écrire des gestionnaires d'exception. Si vous corrigez les problèmes sous-jacents qui sont à l'origine de l'exception, alors vous n'avez pas besoin de gérer quoi que ce soit.
Bien sûr, il y a des situations où ne peux pas garantir que d'un appel de méthode ne cause pas une exception, et vous devez être préparé, mais d'emballage tout en @try/@blocs catch n'est certainement pas la solution.
OriginalL'auteur kubi
Un problème que vous rencontrez est que str n'est jamais initialisée ce qui signifie que les str peut être orienté à zéro (mais ce n'est pas garanti). Il est certainement pointant vers indésirable.
Si vous marchez par le biais de votre code, je peux presque garantir que votre version est appelée sur le zéro, ce qui en Objective-C est tout à fait valable.
Essayez de faire cela:
L'appel de la libération ne pas libérer un objet, il suffit simplement de décrémente le conserver compter par 1. Lorsque l'un des objets de conserver le nombre est 0,
est appelé automatiquement.
Si le code ci-dessus ne permet pas de lever une exception immédiatement, il peut être parce que la véritable libération de la mémoire de messages est retardé à la suite (je ne sais pas exactement quand dealloc est appelée après l'conserver le compte à rebours atteint 0. Je pense il est appelé immédiatement et sur le même thread, mais certains autres de Cacao ninja saurez à coup sûr).
Ce que vous pouvez faire est d'ajouter une catégorie de NSObject et de mettre en œuvre le dealloc et la libération de méthodes et d'essayer de l'attraper vous êtes exception.
L'avantage est que ce code sera valable pour tous les objets de votre application, car il est une catégorie de NSObject.
Pour être complète, si vous venez de la pratique de gestion de la mémoire règles, vous serez amende.
Ne vous inquiétez pas de conserver compte. Vous ne devriez jamais le vérifier, il n'est jamais ce que vous pensez qu'elle devrait être pour diverses raisons. Vous devez prendre soin de la gestion de la mémoire une méthode à la fois. Recherche Stackoverflow et google pour le cacao, la gestion de la mémoire. Il existe de nombreuses ressources pour vous aider. Il peut être difficile de savoir au premier abord, mais devient de plus en plus automatique.
OriginalL'auteur Corey Floyd