{"adoption": {"forks": 272, "observed_at": "2026-08-28T04:05:14.251093+00:00", "stars": 1633}, "canonical_url": "https://ross.abutalabs.com/products/jjexception", "card": {"archived": false, "artifact_type": "library", "description": "Protect the objective-c application(保护App不闪退)", "domain": ["mobile-development", "developer-tools"], "enriched": true, "function": ["error-handling", "logging", "middleware"], "health_score": 20, "homepage": null, "language": "Objective-C", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["jezzmemo/JJException"], "name": "jezzmemo/JJException", "platform": ["cross-platform"], "pushed_at": "2022-12-03T09:15:43+00:00", "repo": "jezzmemo/JJException", "stars": 1633, "tags": ["crash-protection", "objective-c", "method-swizzling", "exception-handling", "cocoapods", "ios-sdk", "ios", "macos", "mobile"], "topics": ["crash", "hook", "ios", "exception-protect", "swizzle-method"], "urls": [], "use_cases": ["prevent ios app from crashing on unrecognized selector", "protect against nsarray out of bounds crash", "avoid kvo crash when observer not removed", "fix nstimer memory leak crash", "catch nsnull crashes in objective-c app", "log runtime exceptions instead of crashing the app"], "what_it_is": "JJException is an Objective-C library that prevents common runtime crashes in iOS and macOS apps by hooking error-prone APIs such as unrecognized selectors, array/dictionary out-of-bounds access, KVO misuse, NSTimer, NSNotification, and string index errors. It intercepts these exceptions, keeps the app running, and forwards exception records to a custom handler for logging and later fixes.", "when_to_avoid": ["you are building a new Swift-only project with modern safe APIs", "you want a full crash reporting/analytics solution rather than crash prevention", "the project needs actively maintained dependencies - last release was 2022"], "when_to_choose": ["you maintain a legacy Objective-C iOS app prone to runtime crashes", "you want a stopgap crash shield while preparing a proper fix or hot-patch", "you need configurable, category-based crash protection with custom logging"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/jjexception", "repo": "jezzmemo/JJException", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:14.251093+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:47:20.572935+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bbef1331b8020f70172d4c13aa4f48b7a4820e7a139f9b3fb979497c1d4a4718", "fetched_at": "2026-08-28T04:05:14.251093+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jezzmemo/JJException"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2981, "days_push": 1369, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}